#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, чтобы помочь, среди прочего, с циклическими зависимостями.