python - 为什么 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()
不将调用类的类名视为当前类的代码;这类似于 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 甚至我认为过去对这个功能感到遗憾)。它主要在文档中描述的特殊情况下有用,您可能希望子类覆盖特殊方法,并且您希望保留该方法的“私有”副本,该副本不能被覆盖。
否则,只需_
对内部属性和方法使用单一约定。
推荐阅读
- react-testing-library - React 测试库:如何在不删除自动清理的情况下显式重用渲染的组件
- javascript - React-Native / Expo 项目中的“无法连接到 Metro 服务器”
- javascript - 如何获取每个成员的订阅者数量?
- reactjs - 设置状态擦除先前的对象值反应
- wifi - RN1810 UDP与电脑通讯
- amazon-mws - 使用 Amazon Selling Partner API 获取订单指标
- c# - C# .NetCore windows 通知?
- mysql - 如何在 SQL 中链接不同的表
- php - Laravel:检查特定的枢轴关系或无关系
- python-3.x - 如何在 python 中编写状态事件矩阵函数?