python - 构建一个python项目
问题描述
我需要知道如何设置 __init__.py 和导入,以便构建一个可以在整个包中使用完全限定名称的 python 项目。
该包将包含许多可能包含冲突名称的子包。包中包含的类将互为子类并包含对彼此的引用。该项目将被生成,因此使用完全限定名称将使生活变得更加简单。
这个示例项目代表了我的目标结构,但只包含一个子项目,而 IDE 似乎对它在运行时失败感到满意。
我的包/__init__.py
import SubPackage as 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
完全是多余的,并且与您尝试使用它的方式不同。这可能是由于名称被绑定或其他原因,但最终不应该在您需要它时出现实例。这使您可以稍微编辑文件:"FileA.py"和"FileB.py":
文件A.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()
文件B.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
使用相对导入而不是绝对导入。在风格上,我倾向于使用相对导入来帮助我快速找出哪些导入是我项目的一部分,哪些是外部依赖项。
推荐阅读
- java - 当 listView 为空时,setEmptyView 不显示图像
- c++ - 将 const 函数引用绑定到 lambda
- r - 如何在不考虑顺序的情况下查找字符串是否包含某些字符?
- google-sheets - Google Sheets api 仅适用于我的浏览器
- sql - PowerApps - 如何从库列表中编辑表单导致一个屏幕
- apache-kafka - Kafka会话超时问题
- node.js - Nginx 上游服务器在其中一个关闭时全部关闭
- r - 如何在有条件的 R 中使用 ColSums
- python - 使用多个分隔符按日期对字符串进行排序
- javascript - 即使在关闭 sweetalert2 后背景仍然存在,使 div 元素无法点击