我有这个结构:
.
└── module
├── __init__.py
└── submodule
├── __init__.py
├── foo.py
└── bar.py
在module.submodule.__init__.py我有这个:
import foo
import bar
在module.submodule.foo.py我有这个:
import very_heavy_third_party_module as vhtpm
...
我想只导入bar,但是我被foo放慢了速度(让我们想象foo和module / __ init__.py中有一个丑陋的time.sleep(3)).
所以我的目标是在下面写这个,而不会被模块的其他部分放慢速度:
from module.submodule.bar import saybar
saybar()
我怎样才能导入位于子模块栏中的saybar?
最佳答案
在不运行foo的情况下从bar导入的唯一方法是从module.submodule.__init__.py中删除import foo.这是因为当您在Python中导入包/模块时,将运行该模块中的所有顶级代码(如果导入包,则为__init__.py).当您从module.submodule.bar导入saybar运行时,所有顶级代码都在:
> module.__init__.py
> module.submodule.__init__.py
> module.submodule.bar.py
运行.由于module.submodule.__init__.py包含import foo,因此导入了foo,并且它的所有顶级代码(包括import very_heavy_third_party_module为vhtpm)也会运行,导致速度减慢.
一些可能的解决方案是:
>从__init__.py中移出尽可能多的代码.将__init __.pys留空是常见的做法 – 如果有一些功能,您可能需要考虑将其移动到自己的模块.一旦导入行是唯一剩余的,您可以删除它们,因为它们对命名空间没有任何影响.
>将foo.py中的import vhtpm从顶层重新定位(例如,转换为模块中其他内容调用的函数).这不是很干净,但如果您需要优化,可能对您有用.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。