我正在尝试使用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})
但出现相同的错误。
答案 0 :(得分:3)
该错误与您使用eval
(但不要使用eval
)无关。这是因为GetChild
不接受self
(或实际上是任何其他自变量)作为其签名中的实例。
应为def GetChild(self)
但是(如果尚不清楚)eval
should be avoided不惜一切代价,并且很少是解决给定问题的唯一方法。
在这种情况下,最好使用getattr
:
obj = MyClass()
y = getattr(obj, 'Get{}'.format('Child'))()
print(y)