@Ninzalo

Есть ли способ аннотировать аргументы метода переменной класса?

Здравствуйте. Есть ли способ аннотировать аргументы метода переменной, которая определяется только после инициализации класса, в котором находится этот метод?

Пример:
from dataclasses import dataclass
from typing import Literal, TypeAlias, Self 

@dataclass()
class BaseConfig:
    ITEM: TypeAlias = Literal["item1", "item2"]

class MyClass:
    def __init__(self, config: BaseConfig = BaseConfig) -> None:
        self.config = config

    def meth(self, item: self.config.ITEM) -> Self:
        ...
  • Вопрос задан
  • 83 просмотра
Решения вопроса 1
Mike_Ro
@Mike_Ro Куратор тега Python
Python, JS, WordPress, SEO, Bots, Adversting
На данный момент в Python нет прямого способа аннотировать типы аргументов, которые зависят от внутреннего состояния объекта или определяются во время исполнения программы.

Как вариант, можно закостылить так:
from dataclasses import dataclass
from typing import Any, Literal, TypeAlias, Self 

@dataclass()
class BaseConfig:
    ITEM: TypeAlias = Literal["item1", "item2"]

class MyClass:
    def __init__(self, config: BaseConfig = BaseConfig) -> None:
        self.config = config

    def meth(self, item: Any) -> Self:
        if item not in self.config.ITEM:
            raise ValueError(f"Invalid value {item} for item. Expected one of {self.config.ITEM}.")
        ...
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Если у тебя config может различаться во время выполнения, то нельзя. Статический анализ не выполняет анализируемый код.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы