You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 16:35:07