python:无法使用eval()运行对象方法

时间:2018-12-27 11:57:25

标签: python built-in

我正在尝试使用eval()运行动态代码,但是它似乎拒绝了基于对象的方法:

def GetHelp():
    return 'Help'

class MyClass:
    def __init__(self):
        self.child = 5
    def GetChild():
        return self.child

x = eval('Get{}()'.format('Help'))
print(x)

obj = MyClass()
y = eval('obj.Get{}()'.format('Child'))
print(y)

上面的代码给我:

Help
Traceback (most recent call last):
  File "/Users/kakyo/Desktop/0.Dev/playground/python/hello_eval.py", line 14, in <module>
    y = eval('obj.Get{}()'.format('Child'))
  File "<string>", line 1, in <module>
TypeError: GetChild() takes 0 positional arguments but 1 was given

我试图将obj添加到locals

y = eval('obj.Get{}()'.format('Child'), {'obj': obj})

但出现相同的错误。

1 个答案:

答案 0 :(得分:3)

该错误与您使用eval(但不要使用eval)无关。这是因为GetChild不接受self(或实际上是任何其他自变量)作为其签名中的实例。

应为def GetChild(self)

但是(如果尚不清楚)eval should be avoided不惜一切代价,并且很少是解决给定问题的唯一方法。

在这种情况下,最好使用getattr

obj = MyClass()
y = getattr(obj, 'Get{}'.format('Child'))()
print(y)