Python:使用参数从文件中的字符串实例化一个类

时间:2016-11-28 22:07:34

标签: python-3.x instantiation

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

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()'

KeyError: 'c2(True)'

有什么想法可以做到这一点吗?

1 个答案:

答案 0 :(得分:1)

您正在实现一种表达如何调用某些功能的迷你语言。这可能会变得困难,但事实证明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