【问题标题】:Why does eval() not find the function?为什么 eval() 找不到函数?
【发布时间】:2020-04-02 20:40:27
【问题描述】:
def __remove_client(self, parameters):
        try:
            client = self.__client_service.remove_client_by_id(int(parameters[0]))

            FunctionsManager.add_undo_operation([self.__client_service, self.__rental_service],
                                                UndoHandler.delete_client_entry, [client[0], client[1]])
            FunctionsManager.add_redo_operation(eval('self.__add_new_client(client[0].id,client[0].name)'))

这给了我:'UI' object has no attribute '__add_new_client' 我该怎么办?还是有另一种方法可以将该函数添加到我的repo() 堆栈中,而无需在我使用该函数时调用该函数?

【问题讨论】:

  • 查看functools.partial 作为将参数绑定到函数的一种方式。它返回一个可以稍后调用的新函数

标签: python python-3.x eval redo


【解决方案1】:

根据Private 方法的文档:

请注意,传递给exec()eval() 的代码不会将调用类的类名视为当前类;这类似于 global 语句的效果,其效果同样仅限于字节编译在一起的代码。同样的限制适用于getattr()setattr()delattr(),以及直接引用__dict__ 时。

至于你的eval()为什么没有意义,这个:

eval('self.__add_new_client(client[0].id,client[0].name)')

完全等同于你刚刚运行代码:

self.__add_new_client(client[0].id,client[0].name)

直接。似乎您可能希望某种延迟的惰性评估或其他东西,但这不是它的工作原理。也许您想通过该方法的部分评估,例如:

from functools import partial
FunctionsManager.add_redo_operation(partial(self.__add_new_client, client[0].id, client[0].name))

如果这是您自己的代码,您实际上不应该使用__ 方法,除非您确切知道自己在做什么。通常没有充分的理由使用此功能(Guido 甚至我认为过去对这个功能感到遗憾)。它仅在文档中描述的特殊情况下很有用,您可能希望子类覆盖特殊方法,并且您希望保留该方法的“私有”副本,该副本不能被覆盖。

否则,只需对内部属性和方法使用单个 _ 约定。

【讨论】:

  • 另外,作为一个好的经验法则,对于日常 Python 代码,几乎没有充分的理由使用 eval() 来处理任何事情。我只在一些非常特殊、狭窄的情况下使用过它。因此,如果您发现自己正在寻找eval(),请停下来,考虑一下可能还有其他方法(即使您必须进行一些研究)。
猜你喜欢
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-26
  • 1970-01-01
相关资源
最近更新 更多