我有一个类名列表作为字符串,如果我说fe。从print(cNames[0])
开始Foo
cNames[0] = "Foo"
。现在,如果我想将类字符串与类进行比较,我会这样做:
if eval(cNames[0]) in classes:
foo = eval(cNames[0])()
然而,它给了我无效的语法错误:
File ".\testing.py", line 54, in convert
print("Class: %s" %eval(cNames[0]))
File "<string>", line 1
<class 'testing.Foo'>
^
SyntaxError: invalid syntax
而且我知道我只打印了这个类名,但它也不适用于if语句,所以我尝试用打印机来做。没效果
修改
所以问题似乎是我调用了eval("<class 'testing.Foo'>")
而不是eval("Foo")
。现在这导致了一些问题,我正在使用sqlite3数据库而我正在尝试将字符串保存为:<class>:i
例如Foo:53
,而是我正在做<class 'testing.Foo'>:53
,这就是为什么在它上面调用eval是行不通的。我怎么能把<class 'testing.Foo'>
(不是字符串,类本身)变成字符串“Foo”?
答案 0 :(得分:3)
我很确定这里发生的事情是你正在做eval()
两次 - 并且cNames[0]
是你在打印时得到的类的表示。也就是说,你正在做:
eval("<class 'testing.Foo'>")
但是,我会说,这是一种不好的做法。存储一个从名称到类的字典并使用它 - 它是更清晰,更可靠,更安全,更快速的方法(如果您真的觉得需要,可以生成此字典)。
答案 1 :(得分:2)
假设您有一个包含您的课程的列表,您可以在不使用eval
class Foo(object):
pass
class Thing(object):
pass
# List of interesting classes
classes = [Foo, Thing]
# Construct a dictionary where the key is the Classes __name__ attribute
classByNames = {cls.__name__:cls for cls in classes}
# Example usage
cName = 'Foo'
if cName in classByNames:
inst = classByNames[cName]()
print(inst) # <__main__.Foo object at ...>
else:
print("Unknown class %s" % cName)
(仅在Python v2.7中对上述内容进行了测试,但在v3中也应该可以正常工作)