python - 构建一个python项目

标签 python python-packaging

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

该包将包含许多可能包含冲突名称的子包。包中包含的类将相互子类化并包含对彼此的引用。将生成项目,因此使用完全限定名称将使生活变得更加简单。

这个示例项目代表了我的目标结构,但只包含一个子项目,而 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()

测试.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 完全是多余的,并且与您尝试使用它的方式不同.这可能是由于何时绑定(bind)了名称或其他原因,但最终应该没有您需要的实例。这使您可以稍微编辑文件:“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()

import 语句也等同于 from .. import Subpackage 使用相对导入而不是绝对导入(如果需要的话)。在风格上,我倾向于使用相对导入来帮助我快速挑选出哪些导入是我的项目的一部分,哪些是外部依赖项。

关于python - 构建一个python项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54425738/

相关文章:

Python正则表达式拆分,任意长度的整数

python - 检测类实例变量值中的重复项

python - 在 Python 中列出目录内容

python - 如何将 setup.py console_script 与 native 命名空间包一起使用

python - 如何将Python包转换为exe?

python - 如何找到 Tkinter 当前使用的 Tcl/Tk 库的路径?

python - 如何使用 Python 打开 Google Chrome 并传入参数?

python - 如何使 Python 模块的 __init__.py 将其 help() 委托(delegate)给同级文件?

python - 无法解析 "import as"情况 ("AttributeError module x has no attribute y")

Python:一个存储库中的多个包还是每个存储库一个包?