【发布时间】:2015-09-29 19:55:58
【问题描述】:
我知道这个问题在这里被问了无数次,但是我被这个问题困扰了很长时间,一直无法在网上找到解决方案。
我有一个导入周期,这里是堆栈跟踪:
Traceback (most recent call last):
File "openldap_lookup.py", line 2, in <module>
import pure.directory_service.ds_lookup as dsl
File "/home/myname/purity/tools/pure/directory_service/ds_lookup.py", line 8, in <module>
import pure.authorization.auth as auth
File "/home/myname/purity/tools/pure/authorization/auth.py", line 16, in <module>
import auth_unix as auth_impl
File "/home/myname/purity/tools/pure/authorization/auth_unix.py", line 17, in <module>
import pure.directory_service.ad_lookup as ad_lookup
File "/home/myname/purity/tools/pure/directory_service/ad_lookup.py", line 1, in <module>
import pure.authorization.auth as auth
AttributeError: 'module' object has no attribute 'auth'
我只导入模块;我避免使用from <module> import <class> 和from <module> import <method>
我尝试在本地重现错误,但 python 没有任何抱怨。这些是本地测试文件:
openldap_lookup.py
import ds_lookup
def openldap_foo():
print ds_lookup.ds_foo
print 'openldap_lookup importing ds_lookup'
ds_lookup.py
import auth as au
def ds_foo():
print au.auth_foo
print 'ds_lookup importing auth'
auth.py
import auth_unix
def auth_foo():
print auth_unix.auth_unix_foo
print 'auth importing auth_unix'
auth_unix.py
import ad_lookup
def auth_unix_foo():
print ad_lookup.ad_foo
print 'auth_unix importing ad_lookup'
ad_lookup.py
import auth as au
def ad_foo():
print au.auth_foo
print 'ad_lookup importing auth'
但是python没有抱怨:
myname@myname-mbp:~/cycletest$ python openldap_lookup.py
ad_lookup importing auth
auth_unix importing ad_lookup
auth importing auth_unix
ds_lookup importing auth
openldap_lookup importing ds_lookup
myname@myname-mbp:~/cycletest$
我不是 python 专家,但我知道导入周期导致了错误。但是为什么小测试文件不会出现同样的错误呢? python中的导入周期何时合法,何时不合法?我该怎么做才能解决这个问题?
非常感谢 Python 专家提供的任何帮助。
既然很多人一定会问,我为什么会有这个循环?
好吧,openldap_lookup 和 ad_lookup 都包含 ds_lookup 中基类的子类。 ds_lookup 需要来自 auth 的常量。 auth 需要 auth_unix 作为实现,auth_unix 依次调用实现 openldap_lookup 和 ad_lookup。
我很想将常量从 auth 中移出并删除循环,但是此代码是大型 git 存储库的一部分,其中数百个文件依赖于 auth 中的常量和方法,我希望避免重构如果可能,所有这些。
【问题讨论】:
标签: python import circular-dependency