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