【问题标题】:python: Unable to use eval() to run object methods [duplicate]python:无法使用 eval() 运行对象方法 [重复]
【发布时间】:2018-12-28 21:34:16
【问题描述】:

我正在尝试使用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})

但遇到了同样的错误。

【问题讨论】:

  • 为什么会有反对票?
  • 这与eval无关,问题可以用普通的obj.GetChild()复现。

标签: python built-in


【解决方案1】:

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

应该是def GetChild(self)

但是(如果还不清楚的话)evalshould be avoided 不惜一切代价,而且很少是解决给定问题的唯一方法。

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

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

【讨论】:

  • 我的错!!!好的,非常感谢!
猜你喜欢
  • 2017-05-09
  • 1970-01-01
  • 2017-01-30
  • 2021-05-23
  • 2014-03-09
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
相关资源
最近更新 更多