为什么 eval() 找不到函数?


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()堆栈中,而无需在我使用它时调用该函数?

根据私有方法的文档:

请注意,传递给exec()eval()的代码不会将调用类的类名视为当前类;这类似于全局语句的效果,全局语句的效果同样仅限于一起进行字节编译的代码。同样的限制适用于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 甚至我认为过去对该功能感到遗憾(。 它主要只是在文档中描述的特殊情况下有用,在这种情况下,您可能打算让子类覆盖特殊方法,并且您希望保留无法重写的方法的"私有"副本。

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

相关内容

  • 没有找到相关文章

最新更新