Python中能否让导入自定义模块的用户直接使用其他模块的函数?
打造你的专属工具聚合模块:mytools
这问题我太有共鸣了——每次写模块都要重复导入functools和itertools里的一堆函数,确实烦得慌!直接整个聚合模块把这俩库的所有公共函数打包在一起,完全是合理的思路,而且实现起来也很直接,咱们来一步步搞:
第一步:编写mytools.py模块
核心思路就是把functools和itertools的所有公共成员导入到mytools的命名空间里,同时正确设置__all__,确保其他模块能顺利导入这些函数。
实现方式一:简洁版(用from ... import *)
# mytools.py import functools import itertools # 导入两个库的所有公共成员到当前模块 from functools import * from itertools import * # 合并两个库的__all__列表,让`from mytools import *`能拿到所有函数 __all__ = functools.__all__ + itertools.__all__
实现方式二:显式版(手动绑定属性)
如果你想更清楚地控制导入过程,也可以手动遍历两个库的__all__,把每个函数绑定到mytools的命名空间:
# mytools.py import functools import itertools # 导入functools的所有公共成员 for name in functools.__all__: globals()[name] = getattr(functools, name) # 导入itertools的所有公共成员 for name in itertools.__all__: globals()[name] = getattr(itertools, name) # 同样合并__all__ __all__ = functools.__all__ + itertools.__all__
这两种方式效果完全一致,选哪种看你个人习惯——第一种更简洁,第二种更显式,能清晰看到每一步的导入逻辑。
第二步:在其他模块中使用mytools
现在你可以在任何模块里直接导入mytools,不用再单独导入functools和itertools了:
方式一:导入整个mytools模块
# 你的业务模块,比如calc.py import mytools # 直接用functools的lru_cache装饰器 @mytools.lru_cache(maxsize=None) def fibonacci(n): if n <= 1: return n return fibonacci(n-1) + fibonacci(n-2) # 直接用itertools的groupby data = ["apple", "apricot", "banana", "blueberry"] for key, group in mytools.groupby(data, key=lambda x: x[0]): print(f"以'{key}'开头的水果:{list(group)}")
方式二:直接导入需要的函数(或全部导入)
如果你习惯直接用函数名,也可以像导入标准库一样操作:
# 导入单个函数 from mytools import lru_cache, groupby @lru_cache(maxsize=None) def fibonacci(n): # ... 同上
或者一次性导入所有函数:
from mytools import * @lru_cache(maxsize=None) def fibonacci(n): # ... 同上
关键细节说明
- 关于
__all__的作用:__all__定义了模块被from ... import *时会导出的成员列表。我们合并functools.__all__和itertools.__all__,就是为了让from mytools import *能导入这两个库的所有公共函数,同时避免导入functools、itertools这两个模块本身。 - 同名函数的处理:幸运的是,
functools和itertools的公共函数没有重名的情况,所以不用担心覆盖问题。如果以后某个库新增了同名函数,后面导入的那个(也就是代码里from itertools import *在后面)会覆盖前面的,这点要注意。 - 自动同步更新:只要
functools或itertools更新时把新函数加入了各自的__all__,mytools会自动包含这些新函数,不需要修改mytools.py的代码,非常省心。
内容的提问来源于stack exchange,提问作者vaer-k
相关产品推荐
相关产品推荐

