0

我有一个作为字符串的类名列表,如果我说 fe. print(cNames[0])它会导致进入Foosince 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”?

4

2 回答 2

3

我很确定这里发生的事情是你正在做eval()两次 - 这cNames[0]就是你在打印它时得到的类的表示。也就是说,你正在做:

eval("<class 'testing.Foo'>")

但是,我会说,这是一种不好的做法。存储一个从名称到类的字典并使用它 - 这是更清晰、更可靠、更安全、更快的方法(如果你真的觉得需要它,你可以生成这个字典)。

于 2012-10-14T10:44:33.893 回答
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 中也应该可以正常工作)

于 2012-10-14T11:04:12.217 回答