Как правильно аннотировать совместную непереносимость в Python? - PullRequest
0 голосов
/ 04 мая 2020

Предположим, у меня есть что-то вроде этого:

from typing import Mapping, Any


class Hidden:

    def __init__(self, z: float, **kwargs: Any):
        super().__init__(**kwargs)
        self.z = z


class Base:

    def __init__(self, x: int, **kwargs: Any):
        super().__init__(**kwargs)
        self.x = x


class Inherited(Base):

    def __init__(self, y: int, **kwargs: Any):
        super().__init__(**kwargs)
        self.y = y


class Final(Inherited, Hidden):
    pass

Как мне это комментировать? Я попытался заменить Any на некоторые варианты использования TypedDict, но ему просто нужен тип значения. Это лучшее, что я могу сделать?

1 Ответ

2 голосов
/ 04 мая 2020

Обновление
Поскольку Inherited для инициализации требуются и x, и y, они должны быть явно определены как аргументы. Kwargs используется для кооперативного наследования, чтобы один класс мог вызывать init другого, не беспокоясь о типе аргументов (здесь z:float). Следовательно, Any действительно является правильной аннотацией в этом случае.

Аналогично, для инициализации Final я бы рекомендовал определить __init__ со всеми необходимыми необходимыми аргументами, т.е. def __init__(self, x:int, y:int, z:float, **kwargs:Any)

Опять же, здесь, Final также может быть унаследован от другого класса, и он не заботится о аргументах производного класса, но сохраняет **kwargs:Any для совместимости совместимого наследования

ps, извините за обход и примерно об одном и том же.

Старый ответ
kwargs в python - это набор пар ключ-значение, которые не входят в число явно определенных аргументов метода. Следовательно, **kwargs в конечном итоге соберет любой аргумент foo=bar, где foo не входит в определенные аргументы.
Значение bar может быть практически любым, поэтому Any используется, так как ** означает, что значения будут заключены в диктат kwargs по своей природе.
Здесь вы можете аннотировать тип значения bar.
**kwargs:int будет означать, что вы можете передать любую необъявленную пару значений ключа до это int.

...