为什么 eval() 找不到函数?
Why does eval() not find the function?
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()
堆栈,而无需在我使用它时调用该函数?
根据 Private 方法的文档:
Notice that code passed to exec()
or eval()
does not consider the classname of the invoking class to be the current class; this is similar to the effect of the global statement, the effect of which is likewise restricted to code that is byte-compiled together. The same restriction applies to getattr()
, setattr()
and delattr()
, as well as when referencing __dict__
directly.
至于为什么你的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 甚至我认为过去对这个功能感到遗憾)。它主要仅在文档中描述的特殊情况下有用,在这种情况下您可能希望子类覆盖特殊方法,并且您希望保留该方法的 "private" 副本,该副本不能被覆盖。
否则只需对内部属性和方法使用单一 _
约定。
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()
堆栈,而无需在我使用它时调用该函数?
根据 Private 方法的文档:
Notice that code passed to
exec()
oreval()
does not consider the classname of the invoking class to be the current class; this is similar to the effect of the global statement, the effect of which is likewise restricted to code that is byte-compiled together. The same restriction applies togetattr()
,setattr()
anddelattr()
, as well as when referencing__dict__
directly.
至于为什么你的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 甚至我认为过去对这个功能感到遗憾)。它主要仅在文档中描述的特殊情况下有用,在这种情况下您可能希望子类覆盖特殊方法,并且您希望保留该方法的 "private" 副本,该副本不能被覆盖。
否则只需对内部属性和方法使用单一 _
约定。