如何在Python模块内部捕获未定义函数调用并转调指定函数
问题描述
我有一个Python模块my_module,仅包含一个名为f的函数,调用my_module.f()是合法操作。我希望在模块内部实现:当调用模块中未定义的函数(如my_module.this_function_is_not_defined())时,不抛出异常,转而调用my_module.f(),且无需模块外额外代码,类似重写类的__getattr__或字典的__getitem__的效果。我自己构思了一段思路代码:
globals().__getitem__ = lambda self, x: self.__getitem__ if self.__contains__(x) else f
请问这个需求是否可行?
可行方案
完全可以实现,Python 3.7及以上版本支持为模块定义__getattr__函数,这正是你需要的特性。
实现方式
- 在
my_module.py中,除了定义函数f,添加一个模块级别的__getattr__函数。当访问模块中不存在的属性(包括未定义的函数)时,Python会自动触发这个函数。 - 在
__getattr__中直接返回f,这样所有未定义的函数调用都会转向执行f。
示例代码
# my_module.py def f(): print("执行了函数f") def __getattr__(name): # 无论访问的未定义属性名称是什么,都返回函数f return f
测试验证
在外部代码中测试:
import my_module my_module.f() # 输出:执行了函数f my_module.undefined_func() # 输出:执行了函数f my_module.random_non_exist_func() # 输出:执行了函数f
关于你的思路代码说明
你修改globals().__getitem__的思路不可行,因为模块的属性查找逻辑并不依赖globals()返回字典的__getitem__方法,而是由模块对象自身的属性查找机制控制。因此,使用模块级__getattr__才是正确的解决方案。
内容的提问来源于stack exchange,提问作者user3876608
相关产品推荐
相关产品推荐

