Как избежать циклической зависимости, вызванной подсказкой типа атрибутов указателя в PythonPython

Программы на Python
Anonymous
Как избежать циклической зависимости, вызванной подсказкой типа атрибутов указателя в Python

Сообщение Anonymous »

Рассмотрим два модуля (в одной папке):
во-первых, person.py

Код: Выделить всё

from typing import List

from .pet import Pet

class Person:
def __init__(self, name: str):
self.name = name
self.pets: List[Pet] = []

def adopt_a_pet(self, pet_name: str):
self.pets.append(Pet(pet_name, self))
а затем pet.py

Код: Выделить всё

from .person import Person

class Pet:
def __init__(self, name: str, owner: Person):
self.name = name
self.owner = owner
Приведенный выше код не будет работать из-за циклической зависимости. Вы получите сообщение об ошибке:

Код: Выделить всё

ImportError: cannot import name 'Person'
Некоторые способы заставить это работать:
  • храните определения классов Person и Pet в одном файле.
  • откажитесь от атрибута pet.owner (который служит удобным указателем)
  • не используйте подсказки/аннотации типов там, где это необходимо. вызовет циклические ссылки:
например. просто возьми:

Код: Выделить всё

class Pet:
def __init__(self, name: str, owner):
Я вижу некоторые недостатки во всех вариантах, которые я перечислил до сих пор.
Есть ли другой способ?
Тот, который позволяет мне чтобы
  • разделить классы на разные файлы
  • использовать аннотацию типа в сочетании с указателями, как показано
Или: есть ли веская причина вместо этого следовать одному из решений, которые я уже перечислил?

Подробнее здесь: https://stackoverflow.com/questions/466 ... ributes-in

Вернуться в «Python»