Как аннотировать атрибут класса данных как объект другого класса данных?

#python #annotations #type-hinting #python-typing #python-dataclasses

Вопрос:

У меня есть два класса данных, таких как:

 from dataclasses import dataclass
from pathlib import Path

@dataclass
class InnerDataClass:
    host: str

@dataclass
class OuterDataClass:
    directory: Path
    host: InnerDataClass
 

Когда я звоню OuterDataClass(...) , Python возвращает ошибку NameError: name 'InnerDataClass' is not defined в последней строке. Почему это происходит и как я могу это решить?

Комментарии:

1. Я не получаю никаких ошибок… Какую версию вы используете?

2. версия Python 3.8.6

3. Он работает в версии 3.8.5

Ответ №1:

Ваш пример действительно работает, у вас, вероятно, был порядок классов наоборот в вашем реальном коде. Файлы кода Python выполняются строка за строкой, поэтому, когда выполняется тело класса первого класса, второй класс уже должен существовать. Вы должны объявлять классы в порядке, соответствующем их внутренней иерархии снизу вверх, если хотите, чтобы все работало.


Но если все, что вы делаете, — это аннотирование, а не фактическое создание экземпляра, вы также можете сделать это:

 from __future__ import annotations

from dataclasses import dataclass
from pathlib import Path


@dataclass
class OuterDataClass:
    directory: Path
    host: InnerDataClass

@dataclass
class InnerDataClass:
    host: str
 

Запуск from __future__ import annotations в первой строке вашего файла кода приведет к работе аннотаций, независимо от того, в каком порядке были определены классы. Он был представлен как PEP 563, чтобы помочь, среди прочего, с циклическими зависимостями.