构建一个 python 项目
Structuring a python project
我需要知道如何设置 __init__.py 和导入,以便构建一个 python 项目,我可以在整个包中使用完全限定的名称。
该包将包含许多子包,这些子包可能包含冲突的名称。包中包含的 classes 将相互 class 并包含对彼此的引用。将生成项目,因此使用完全限定名称将使生活变得更简单。
这个示例项目代表了我的目标结构,但只包含一个子项目,而 IDE 似乎很高兴它在 运行.
时失败了
MyPackage/__init__.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'
您已经不能在 SubPackage
级别发生名称冲突,因此添加 MyPackage
完全是多余的,并且与您尝试使用它的方式不同。这可能是由于何时绑定了名称或其他原因,但最终应该没有您需要的实例。这使您可以稍微编辑文件:"FileA.py" 和 "FileB.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
使用相对导入而不是绝对导入(如果需要的话)。从风格上讲,我倾向于使用相对导入来帮助我快速挑选出哪些导入是我的项目的一部分,哪些是外部依赖项。
我需要知道如何设置 __init__.py 和导入,以便构建一个 python 项目,我可以在整个包中使用完全限定的名称。
该包将包含许多子包,这些子包可能包含冲突的名称。包中包含的 classes 将相互 class 并包含对彼此的引用。将生成项目,因此使用完全限定名称将使生活变得更简单。
这个示例项目代表了我的目标结构,但只包含一个子项目,而 IDE 似乎很高兴它在 运行.
时失败了MyPackage/__init__.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'
您已经不能在 SubPackage
级别发生名称冲突,因此添加 MyPackage
完全是多余的,并且与您尝试使用它的方式不同。这可能是由于何时绑定了名称或其他原因,但最终应该没有您需要的实例。这使您可以稍微编辑文件:"FileA.py" 和 "FileB.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
使用相对导入而不是绝对导入(如果需要的话)。从风格上讲,我倾向于使用相对导入来帮助我快速挑选出哪些导入是我的项目的一部分,哪些是外部依赖项。