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

2024-10-08 23:23:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个类名列表作为字符串,如果我说fe。print(cNames[0])它将导致Foo,因为cNames[0] = "Foo"。如果我想比较一个类字符串和一个类,我会这样做:

if eval(cNames[0]) in classes:
    foo = eval(cNames[0])()

但是,它给了我无效的语法错误:

^{pr2}$

我知道我只打印类名,但它也不适用于if语句,所以我试着用印刷体来打印。没有效果

编辑: 所以问题似乎是我打给eval("<class 'testing.Foo'>")而不是{}。现在这会导致一些问题,我正在使用sqlite3数据库,并尝试将一个字符串保存如下:<class>:i例如Foo:53,但是我做的是<class 'testing.Foo'>:53,这就是为什么对它调用eval不会起作用。如何将<class 'testing.Foo'>(不是字符串,类本身)转换为字符串“Foo”?在


Tags: 字符串in列表iffooevaltestingclass
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)

(仅在pythonv2.7中测试了上述内容,但在v3中也应该可以正常工作)

我很确定这里发生的是你在做eval()两次,而{}是你打印这个类时得到的表示。也就是说,你正在做的是:

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

不过,我要说的是,这是一种不好的方式。存储一个字典,从名字到类,然后使用它——这是一个更清晰、更可靠、更安全、更快的方法(如果你真的觉得需要的话,你可以生成这个字典)。在

相关问题 更多 >

    热门问题