代码之家  ›  专栏  ›  技术社区  ›  Sprotty

构建python项目

  •  3
  • Sprotty  · 技术社区  · 7 年前

    我需要知道如何设置_init__.py和导入,以便构造一个python项目,在这个项目中,我可以在整个包中使用完全限定的名称。

    这个示例项目代表了我的目标结构,但只包含一个子项目,而IDE似乎很高兴它在运行时失败了。

    MyPackage/\uuuu init\uuuuu.py

    import SubPackage as SubPackage
    

    MyPackage/SubPackage/_init__.py

    from .FileB import ClassB
    from .FileA import ClassA
    

    MyPackage/SubPackage/FileA.py

    from __future__ import absolute_import
    import MyPackage
    
    
    class ClassA(MyPackage.SubPackage.ClassB):
        thingA: 'MyPackage.SubPackage.ClassA'
        thingB: MyPackage.SubPackage.ClassB
    
        def __init__(self):
            self.thingA = None
            self.thingB = None
    
        def test(self):
            self.thingA = MyPackage.SubPackage.ClassA()
            self.thingB = MyPackage.SubPackage.ClassB()
    

    MyPackage/SubPackage/FileB.py

    from __future__ import absolute_import
    import MyPackage
    
    
    class ClassB(object):
        nextB: 'MyPackage.SubPackage.ClassB'
    
        def __init__(self):
            self.nextB= None
    
        def test(self):
            self.nextB= MyPackage.SubPackage.ClassB()
    

    test.py

    import MyPackage
    
    x = MyPackage.SubPackage.ClassA()
    

    错误

      File "C:\temp\Test.py", line 3, in <module>
        import GeneratedLx
      File "C:\temp\MyPackage\__init__.py", line 1, in <module>
        import Bs as Bs
      File "C:\temp\MyPackage\SubPackage\__init__.py", line 12, in <module>
        from .FileA import ClassA
      File "C:\temp\MyPackage\SubPackage\FileA.py", line 5, in <module>
        class ClassA(MyPackage.SubPackage.ClassB):
    AttributeError: module 'MyPackage' has no attribute 'SubPackage'
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Aaron    7 年前

    此时您已经不能有名称冲突 SubPackage 级别,所以添加 MyPackage 它完全是多余的,并且不像您试图使用它的方式那样工作。这可能是由于名称被绑定或其他原因造成的,但最终在您需要它时不应该有实例。这使您可以稍微编辑文件: “FileA.py” :

    FileA.py

    from __future__ import absolute_import
    from MyPackage import SubPackage
    
    
    class ClassA(SubPackage.ClassB):
        thingA: 'SubPackage.ClassA'
        thingB: SubPackage.ClassB
    
        def __init__(self):
            self.thingA = None
            self.thingB = None
    
        def test(self):
            self.thingA = SubPackage.ClassA()
            self.thingB = SubPackage.ClassB()
    

    FileB.py

    from __future__ import absolute_import
    from MyPackage import SubPackage
    
    
    class ClassB(object):
        nextB: 'SubPackage.ClassB'
    
        def __init__(self):
            self.nextB= None
    
        def test(self):
            self.nextB= SubPackage.ClassB()
    

    from .. import Subpackage 如果需要,使用相对导入而不是绝对导入。从风格上来说,我倾向于使用相对导入来帮助我快速选择哪些导入是我项目的一部分,哪些是外部依赖项。