Python如何直接导入包内所有函数?解决嵌套调用问题
如何直接调用simupy包内模块的函数?
我懂你的需求——你现在用from simupy import *导入包后,还得通过blk.blk_func(val_param)这种方式调用模块里的函数,希望能直接用blk_func(val_param)来调用对吧?咱们只需要修改simupy/__init__.py的代码,把模块里的函数直接挂载到包的命名空间就行,具体操作如下:
修改__init__.py代码
替换你原来的__init__.py内容为下面这段:
import os import importlib dir_path = os.path.dirname(os.path.realpath(__file__)) file_lst = os.listdir(dir_path) filename_lst = list(filter(lambda x: x[-3:] == '.py', file_lst)) filename_lst = list(map(lambda x: x[:-3], filename_lst)) filename_lst.remove('__init__') __all__ = [] # 遍历每个模块,把成员导入到包的全局命名空间 for module_name in filename_lst: # 动态导入当前包下的模块 module = importlib.import_module(f'.{module_name}', package=__name__) # 获取模块中需要暴露的成员:优先用模块自己定义的__all__,没有的话取非私有成员 module_members = getattr(module, '__all__', [attr for attr in dir(module) if not attr.startswith('_')]) # 将成员添加到包的命名空间,并更新__all__列表 for member in module_members: globals()[member] = getattr(module, member) __all__.append(member)
代码解释
- 原来的代码只是把模块名(比如
blk、info)加入了__all__,所以from simupy import *导入的是模块对象,而不是模块里的函数。 - 新代码用
importlib动态导入每个模块,然后把模块里的成员(函数、变量等)直接放到包的全局命名空间里,同时更新__all__列表,这样from simupy import *就会把这些成员直接导入到你的test.py中。 - 如果你的
blk.py或info.py里定义了自己的__all__列表(比如blk.py里写__all__ = ['blk_func']),代码会优先遵循模块的定义,只导入指定的成员,这是更规范的做法。
测试使用
现在在test.py里写:
from simupy import * # 直接调用函数就行 blk_func(val_param)
内容的提问来源于stack exchange,提问作者Tian
相关产品推荐
相关产品推荐

