在
typing
模块中,TypeVar
和 NewType
都需要一个字符串作为第一个位置参数,用作创建对象的 __name__
属性。这里__name__
的目的是什么?
考虑到这是一个强制性的论点,我希望它是必不可少的。在引入类型提示的 PEP-484 中,参数通常设置为分配给对象的变量名字符串:
T = TypeVar('T', int, float, complex)
但是,我真的无法说出它最终如何在
typing.py
中用于 CPython
。在我的测试中,用任何其他字符串替换该字符串似乎不会破坏任何内容。
__name__
属性是 IDE 将在其类型提示中使用的关联类型名称。给出以下玩具代码:
T = TypeVar('not_T', int, float)
def test_func(arg: T): pass
使用
test_func('not_a_number')
等不正确的内容调用函数会导致如下所示的类型提示:
Expected type 'not_t', got 'str' instead
就 python 解释器而言,
type.__name__
与用于处理它的名称标签之间的一致性没有设置任何限制,但其他第三方工具(例如 mypy
)可能不接受不同的变量名称和 __name__
,这也是初始打字的要求PEP-484:
TypeVar() 的参数必须是一个字符串,等于为其分配的变量名称。类型变量不得重新定义。
对于其他用例,您还可以检查用于键入提示的任何对象的
__annotations__
成员中的类型,例如
print(test_func.__annotations__)
>> {'arg': ~not_T}
并使用它在代码中实现进一步的类型检查或处理 - 在这种情况下,您的
TypeVar.__name__
最好更有意义:)