Структурирование проекта Python - PullRequest
0 голосов
/ 29 января 2019

Мне нужно знать, как настроить __init__.py и import для структурирования проекта python, где я могу использовать полностью определенные имена в пакете.

Пакет будет содержать несколько подпакетов, которые могут содержать конфликтующие имена.Классы, содержащиеся в пакете, будут подклассами друг друга и содержат ссылки друг на друга.Проект будет сгенерирован таким образом, что использование полностью определенных имен сделало бы жизнь намного проще.

Этот пример проекта представляет структуру, к которой я стремлюсь, но содержит только один подпроект, в то время как IDE кажется довольнымсбой при запуске*

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 Ответ

0 голосов
/ 29 января 2019

У вас уже не может быть конфликтов имен на уровне 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 с использованием относительного импорта, а не абсолютного при желании.Стилистически я склонен использовать относительный импорт, чтобы помочь мне быстро определить, какие импортные компоненты являются частью моего проекта, а какие являются внешними зависимостями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...