Python 3.x Python:使用参数从文件中的字符串实例化类

Python 3.x Python:使用参数从文件中的字符串实例化类,python-3.x,instantiation,Python 3.x,Instantiation,我在代码中导入了几个类,但我只需要实例化文本文件中列出的那些类。所以我有类似的东西 from module1 import c1 from module2 import c2 ... 在文本文件中,我只列出了我想要实例化的类 c1() c2(True) ... 所以我想把文件行读入一个列表(类),然后做类似的事情 for i in classes: classes_list.append(i) 因此列表中的每个元素都是一个实例化的类。我试着根据我在这里找到的其他解决方案来做这件事

我在代码中导入了几个类,但我只需要实例化文本文件中列出的那些类。所以我有类似的东西

from module1 import c1
from module2 import c2
...
在文本文件中,我只列出了我想要实例化的类

c1()
c2(True)
...
所以我想把文件行读入一个列表(类),然后做类似的事情

for i in classes:
    classes_list.append(i)
因此列表中的每个元素都是一个实例化的类。我试着根据我在这里找到的其他解决方案来做这件事

for i in classes:
    classes_list.append(globals()[i])
但我总是犯这个错误

KeyError: 'c1()'


你知道这样的事情怎么可能吗?

你正在实现一种微型语言,它表达了如何调用某些函数。这可能会很困难,但事实证明python已经用
eval
函数实现了自己的迷你语言。使用
eval
,python将编译和执行python表达式

这对于来自网络上匿名和潜在恶意用户的内容来说是有风险的,但对于具有一定信任度的人来说可能是一个合理的解决方案。例如,如果编写这些文件的人在您的组织中,并且可能会以各种方式干扰您,那么您可以信任他们。我实现了一个系统,人们可以编写测试代码的片段,而我的系统会将其全部打包,并将其转换为一个测试套件。没问题,因为这些人已经完全可以访问测试中的系统

模块1.py

def c1(p=1):
    return p

def c2(p=1):
    return p

def c3(p=1):
    return p
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))
test.py

def c1(p=1):
    return p

def c2(p=1):
    return p

def c3(p=1):
    return p
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

你不想用这种奇怪的文本格式来代替它有什么原因吗?不,我觉得一切正常。唯一的要求是需要从文本文件中读取类列表,因为其他人将定义他们想要使用的类,而我无法知道他们将选择哪些类。另外,人们可能希望c2以真或假为参数,我也无法知道这些线有多复杂<代码>c2(真)好的,我可以得到真/假。我可以有多个参数吗?整数?数学(例如,
c2(1+3)
)怎么样?您正在定义一种小型语言,这可能会变得很困难。您可以对文件中的每一行执行
eval(line)
,这样用户就可以添加完整的python表达式,比如调用多个函数
c2(c1())
。其中一些函数也有字符串作为参数。我想有些将来可能会有数字。他们都有最大的一个论点,但在未来可能会更多,所以也许我需要一个更好的解决方案…我认为eval是有效的。谢谢@tdelaney