结构建议解决ImportErrors

时间:2017-09-12 14:48:53

标签: python importerror

您好我是python的新手,并认为我对我构建的程序结构有疑问。

这是我想到的结构的摘录。

.
└── asd
    ├── asd.py
    ├── __init__.py
    ├── Framework
    │   ├── importer.py
    │   └── __init__.py
    ├── Library
    │   ├── libraryManager.py
    │   └── __init__.py

实际上asd下还有更多的包。 asd.py旨在成为'主要'。它实例化其他包中包含的不同类的许多对象,例如它有几个libraryManager对象。导入程序可以导入(不仅仅是)库文件。

我认为我的关键缺陷如下:要使不同包中的类能够访问asd的每个其他实例,他们会获得对主asd的引用作为参数。 这些是有问题的文件:

asd.py

from asd.Framework.importer import importer
from asd.Library.libraryManager import libraryManager
class asd(object):

    def __init__(self):
        # instantiate several objects
        self.nodeLibMng = libraryManager("DbNodeLibrary.txt")
        self.importer = importer(self)

importer.py

from asd.asd import asd
class importer(object):

    def __init__(self, asdRef : asd):
        self.asdRef = asdRef

    def importNode (self,item):
        # The following line shows why I want this reference construct.
        self.asdRef.nodeLibMng.appendItemToLibraryDB(item)

现在,如果我想运行asd.py,我会收到以下错误:

ImportError: No module named 'asd.Framework'; 'asd' is not a package

如果我在importer.py中运行测试代码,我会收到此错误:

ImportError: cannot import name 'asd'

其他主题如ImportError: Cannot import name X表明我有循环依赖导入。

那么如何解决这个问题,但保持行为,每个类都可以与asd的实例进行通信?

编辑0: 我通过添加

来启动asd.pyimporter.py
if __name__ == '__main__': 
    asd=asd()

1 个答案:

答案 0 :(得分:0)

对于遇到同样问题的人: 我只是放弃了引用的输入类型的规范,并相信自己和其他人给出正确的引用。另外,我在try: except:块中包含对引用的所有访问。

所以在上面的例子中:

class importer(object):
    # compare to the previous def __init__(self, asdRef : asd):
    def __init__(self, asdRef):
        self.asdRef = asdRef

    def importNode (self,item):
        # The following line shows why I want this reference construct.
        try:
            self.asdRef.nodeLibMng.appendItemToLibraryDB(item)
        except:
            raise