Python:使用参数从文件中的字符串实例化一个 class
Python: Instantiate a class from strings in file with arguments
我在代码中导入了多个 classes,但我只需要实例化文本文件中列出的那些 classes。所以我有这样的东西
from module1 import c1
from module2 import c2
...
并且在文本文件中我只列出了那些我想实例化的 classes
c1()
c2(True)
...
所以我想将文件行读入列表(classes)并做类似
的事情
for i in classes:
classes_list.append(i)
这样列表中的每个元素都是实例化的 class。我尝试根据我在此处找到的其他解决方案来执行此操作
for i in classes:
classes_list.append(globals()[i])
但我总是遇到这个错误
KeyError: 'c1()'
或
KeyError: 'c2(True)'
知道这样的事情怎么可能吗?
您正在实现一种表达如何调用某些函数的微型语言。这可能会变得困难,但事实证明 python 已经使用 eval
函数实现了自己的迷你语言。使用 eval
,python 将编译并执行 python 表达式。
对于来自网络上匿名和潜在恶意用户的内容,这被认为是有风险的,但对于具有一定信任度的人来说可能是一个合理的解决方案。例如,如果编写这些文件的人在您的组织中,并且无论如何都可能以一千种方式扰乱您,那么您可以信任他们。我实现了一个系统,人们可以编写测试代码片段,我的系统会将其全部打包并将其变成一个测试套件。没问题,因为这些人已经可以完全访问被测系统。
module1.py
def c1(p=1):
return p
def c2(p=1):
return p
def c3(p=1):
return p
test.py
import module1
my_globals = {
'c1': module1.c1,
'c2': module1.c2,
'c3': module1.c3,
}
test = ["c1()",
"c2(p=c1())",
"c3('i am a string')",
"c1(100)"]
for line in test:
print(line.strip() + ':', eval(line, my_globals))
结果
c1(): 1
c2(p=c1()): 1
c3('i am a string'): i am a string
c1(100): 100
我在代码中导入了多个 classes,但我只需要实例化文本文件中列出的那些 classes。所以我有这样的东西
from module1 import c1
from module2 import c2
...
并且在文本文件中我只列出了那些我想实例化的 classes
c1()
c2(True)
...
所以我想将文件行读入列表(classes)并做类似
的事情for i in classes:
classes_list.append(i)
这样列表中的每个元素都是实例化的 class。我尝试根据我在此处找到的其他解决方案来执行此操作
for i in classes:
classes_list.append(globals()[i])
但我总是遇到这个错误
KeyError: 'c1()'
或
KeyError: 'c2(True)'
知道这样的事情怎么可能吗?
您正在实现一种表达如何调用某些函数的微型语言。这可能会变得困难,但事实证明 python 已经使用 eval
函数实现了自己的迷你语言。使用 eval
,python 将编译并执行 python 表达式。
对于来自网络上匿名和潜在恶意用户的内容,这被认为是有风险的,但对于具有一定信任度的人来说可能是一个合理的解决方案。例如,如果编写这些文件的人在您的组织中,并且无论如何都可能以一千种方式扰乱您,那么您可以信任他们。我实现了一个系统,人们可以编写测试代码片段,我的系统会将其全部打包并将其变成一个测试套件。没问题,因为这些人已经可以完全访问被测系统。
module1.py
def c1(p=1):
return p
def c2(p=1):
return p
def c3(p=1):
return p
test.py
import module1
my_globals = {
'c1': module1.c1,
'c2': module1.c2,
'c3': module1.c3,
}
test = ["c1()",
"c2(p=c1())",
"c3('i am a string')",
"c1(100)"]
for line in test:
print(line.strip() + ':', eval(line, my_globals))
结果
c1(): 1
c2(p=c1()): 1
c3('i am a string'): i am a string
c1(100): 100