使用eval时,Python语法无效(strClass)

时间:2012-10-14 10:38:37

标签: python class python-3.x eval classname

我有一个类名列表作为字符串,如果我说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”?

2 个答案:

答案 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中也应该可以正常工作)