Python 是一种极其优雅的语言。好吧,除了……除了进口。我仍然无法让它按照我认为自然的方式工作。
我有课MyObjectA
这是在文件中mypackage/myobjecta.py
。该对象使用一些实用函数,这些函数位于mypackage/utils.py
。所以在我的第一行中myobjecta.py
我写的:
from mypackage.utils import util_func1, util_func2
但是一些实用函数创建并返回新的实例MyObjectA
。所以我需要写进去utils.py
:
from mypackage.myobjecta import MyObjectA
好吧,不,我不能。这是循环导入,Python 将拒绝这样做。
关于这个问题有很多问题,但似乎没有一个给出令人满意的答案。从我在所有答案中可以读到的内容:
- 重新组织你的模块,你做错了!但是我不知道
即使在像我这样简单的情况下如何更好地组织我的模块
呈现。
- 尝试一下
import ...
而不是from ... import ...
(我个人讨厌编写并可能重构所有完整的
名称限定符;我喜欢看看我到底导入了什么
来自外界的模块)。那会有帮助吗?我不知道,
仍然存在循环进口。
- 在使用其他模块中的某些内容之前,请进行一些黑客操作,例如在函数体的内部作用域中仅导入一行内容。
我仍然希望有第 4 号解决方案,从功能性、优雅性、简单性和工作性的意义上来说,它是 Pythonic 的。或者说没有?
注意:我主要是一名 C++ 程序员,上面的例子很容易通过包含相应的头文件来解决,我不敢相信这在 Python 中是不可能的。
在函数体中导入某些东西并没有什么黑客之处,它是一个绝对有效的模式:
def some_function():
import logging
do_some_logging()
Usually ImportError
s 只是因为方式而被提高import()
调用时评估整个文件的顶级语句。
如果您没有logic循环依赖...,在Python中没有什么是不可能的......
如果您确实希望导入的内容排在首位,那么有一种解决方法:
来自 David Beazley 的精彩演讲模块和包:生死攸关! - PyCon 2015 https://www.youtube.com/watch?v=0oTh1CXRaQ0, 1:54:00
,这里是Python中处理循环导入的一种方法:
try:
from images.serializers import SimplifiedImageSerializer
except ImportError:
import sys
SimplifiedImageSerializer = sys.modules[__package__ + '.SimplifiedImageSerializer']
这尝试导入SimplifiedImageSerializer
and if ImportError
被引发(由于循环导入错误或它不存在),它将从导入缓存中提取它。
PS:您必须以 David Beazley 的声音阅读整篇文章。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)