@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:
        ...
  • Вопрос задан
  • 86 просмотров
Решения вопроса 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 может различаться во время выполнения, то нельзя. Статический анализ не выполняет анализируемый код.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы