在Python中, 当我们拥有一个具有多个子模块的包时,可能会遇到这样的问题:希望在包的外部引用子模块中的成员,但是并不希望在包的命名空间中看到子模块本身。这可能会导致代码的可读性和维护性降低。
举个例子,假设我们有一个名为
test.py package/ __init__.py foo_module.py example_module.py
在
>>> vars(package) mapping_proxy({foo: <function foo at 0x…}, {example: <function example at 0x…})
也就是说,我希望
2、解决方案
有多种方法可以解决这个问题,其中一种方法是使用
from package.foo_module import foo
对于
from package.foo_module import foo from package.example_module import example __all__ = [foo, example] # not strictly necessary, but makes clear what is public
在
from package import example
注意,这种方法只适用于在包层级运行
另一种方法是使用动态导入。这涉及在
def _import_all_modules(): """ Dynamically imports all modules in this package. """ import traceback import os global __all__ __all__ = [] globals_, locals_ = globals(), locals() # Dynamically import all the package modules in this file's directory. for filename in os.listdir(__name__): # Process all python files in directory that don't start # with underscore (which also prevents this module from # importing itself). if filename[0] != '_' and filename.split('.')[-1] in ('py', 'pyw'): modulename = filename.split('.')[0] # Filename sans extension. package_module = '.'.join([__name__, modulename]) try: module = __import__(package_module, globals_, locals_, [modulename]) except: traceback.print_exc() raise for name in module.__dict__: if not name.startswith('_'): globals_[name] = module.__dict__[name] __all__.append(name) _import_all_modules()
在
from package import *
这种方法更加动态,不需要在