Как избежать циклической зависимости, вызванной подсказкой типа атрибутов указателя в 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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