假设我有一个具有以下结构的软件包:
package-folder
|_ mypackage
|_ __init__.py
|_ module1.py
setup.py
哪里__init__.py
是空的
module1.py
:
def do_stuff():
print('Did stuff.')
setup.py
其中包含用于制作软件包的通常上下文,可以将其安装pip install -e pkgpath
在本地系统上。
在中script.py
,我必须这样做:
import mypackage as abbr
abbr.module1.do_stuff()
# output: Did stuff.
我想要的电话是:
abbr.do_stuff()
# output: Did stuff.
abbr.function()
?需要更改哪些代码?__init__.py
-files,但是我不知道怎么做。package-folder
|_ mypackage
|_ __init__.py
|_ module1.py #with function do_stuff1()
|_ subpackage
|_module2.py #with function do_stuff2()
setup.py
致电应为:
abbr.do_stuff1()
abbr.subpackage.do_stuff2()
而不是:
abbr.module1.do_stuff1()
abbr.subpackage.module2.do_stuff2()
您已经很接近答案了,只需要从中导入方法即可__init__.py
。
您还可以添加特殊变量__all__
,该特殊变量是用户期望在该文件中找到的变量/函数/ etc的列表。
__init__.py
@ mypackage
from .module1 import do_stuff1
__all__ = ['do_stuff1']
__init__.py
@ subpackage
from .module2 import do_stuff2
__all__ = ['do_stuff2']
要使顶级包导入所有子包符号,可以将__init__.py
@更改mypackage
为:
import pkgutil
from .module1 import do_stuff1
__all__ = ['do_stuff']
for loader, name, is_pkg in pkgutil.walk_packages(__path__):
module = loader.find_module(name).load_module(name)
__all__.extend(module.__all__)
for var in module.__all__:
globals()[var] = getattr(module, var)
这样,您不仅可以打电话,abbr.subpackage.do_stuuf2()
而且可以abbr.do_stuuf2()
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句