为什么Python中不允许单一类型约束?

时间:2018-05-05 02:04:58

标签: python types python-3.6

假设您想约束一个类型变量来实现某个接口。你可能会这样写:

from typing import TypeVar, Callable

T = TypeVar('T', Callable)

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

>> TypeError: A single constraint is not allowed

为什么Python对这种类型约束的使用不满意? PEP 484Python source code在这方面无益。

注意:在我的特定情况下,我感兴趣的是约束一个类型变量来实现一个抽象基类,但原理是相同的。

2 个答案:

答案 0 :(得分:8)

您正在寻找bound

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

来自the docs

  

类型变量可以使用bound=<type>指定上限。这意味着类型变量替换(显式或隐式)的实际类型必须是边界类型的子类,请参阅PEP 484.

TypeVar(name, *args)表示该类型必须是args之一,因此如果允许TCallable的所有实例都可由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

答案 1 :(得分:0)

约束用户名必须为int

from typing import NewType
UserId = NewType('UserId', int)
some_id = UserId(524313)