如何为Python模块中所有函数添加前缀?以foo.py与bar.py为例
嘿,这个问题我刚好碰到过,给你两种可行的方案,看哪种更适合你的场景:
方案一:直接修改foo.py的函数名(最直观稳妥)
如果允许改动foo.py的源代码,最直接的方式就是手动给所有自定义函数加上foo_前缀。比如原来的foo.py是这样的:
# foo.py def add(a, b): return a + b def multiply(a, b): return a * b
修改后变成:
# foo.py def foo_add(a, b): return a + b def foo_multiply(a, b): return a * b
之后在bar.py里就能正常导入使用了:
# bar.py # 按需导入特定函数 from foo import foo_add, foo_multiply # 或者一次性导入所有带前缀的函数 # from foo import * print(foo_add(2, 3)) # 输出5
方案二:在bar.py中动态添加前缀(无需修改foo.py)
如果因为某些限制不能改动foo.py的代码,那可以在bar.py里通过动态导入的方式,自动给导入的函数加上foo_前缀,再注入到bar的命名空间中。具体实现如下:
先保留原foo.py不变:
# foo.py def add(a, b): return a + b def multiply(a, b): return a * b
然后在bar.py中编写这段逻辑:
# bar.py import foo import inspect # 遍历foo模块的所有成员,筛选出自定义函数 for name, obj in inspect.getmembers(foo, inspect.isfunction): # 给函数名添加foo_前缀 new_func_name = f"foo_{name}" # 将重命名后的函数绑定到bar的全局命名空间 globals()[new_func_name] = obj # 现在就能直接使用带前缀的函数了 print(foo_add(2, 3)) # 输出5 print(foo_multiply(4, 5)) # 输出20
这里用到inspect模块来精准识别函数,能自动排除模块里的类、变量、导入的外部函数等非目标对象。如果需要跳过某些特定函数,只需在循环里加个判断,比如if name != "skip_this_func":即可。
内容的提问来源于stack exchange,提问作者user592419
相关产品推荐
相关产品推荐

