Почему ограничения одного типа запрещены в Python? - PullRequest
0 голосов
/ 05 мая 2018

Предположим, вы хотите ограничить переменную типа для реализации определенного интерфейса. Вы могли бы написать что-то вроде этого:

from typing import TypeVar, Callable

T = TypeVar('T', Callable)

class Foo(Generic[T]):
    ...

>> TypeError: A single constraint is not allowed

Почему Python недоволен этим использованием ограничений типа? PEP 484 и исходный код Python не помогают в этом отношении.

Примечание: в моем конкретном случае меня интересует ограничение переменной типа для реализации абстрактного базового класса, но принцип тот же.

1 Ответ

0 голосов
/ 05 мая 2018

Вы ищете bound:

T = TypeVar('T', bound=Callable)

С Документы :

переменная типа может указывать верхнюю границу, используя bound=<type>. Это означает, что фактический тип, замененный (явно или неявно) переменной типа, должен быть подклассом типа границы, см. PEP 484.

TypeVar(name, *args) означает, что тип должен быть одним из args, поэтому все экземпляры T будут просто заменены на Callable, если разрешено T = TypeVar('T', Callable).

Вы должны увидеть разницу здесь (хотя я на самом деле не пробовал, хе):

from typing import Generic, TypeVar, Callable

T = TypeVar('T', Callable, bool)

class Foo(Generic[T]):
    value: T

    def __init__(self, value: T) -> None:
        self.value = value

class Bar:
    baz = 5

    def __call__(self):
        pass

f = Foo(Bar())
print(f.value.baz)  # doesn’t typecheck because f.value is only a Callable
...