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

问题描述 投票:1回答:1
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()堆栈中而无需在我处于调用状态时调用该函数?

python python-3.x eval redo
1个回答
0
投票

根据Private方法的文档:

[注意,传递给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甚至对过去的功能感到遗憾)。在文档中描述的特殊情况下,它仅是非常有用的,在这种情况下,您可能打算让子类重写特殊方法,并且您希望保留该方法的“私有”副本,而该副本不能被覆盖。]

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

© www.soinside.com 2019 - 2024. All rights reserved.