TypeVar、NewType 中 __name__ 的用途

问题描述 投票:0回答:1

typing
模块中,
TypeVar
NewType
都需要一个字符串作为第一个位置参数,用作创建对象的
__name__
属性。这里
__name__
的目的是什么?

考虑到这是一个强制性的论点,我希望它是必不可少的。在引入类型提示的 PEP-484 中,参数通常设置为分配给对象的变量名字符串:

T = TypeVar('T', int, float, complex)

但是,我真的无法说出它最终如何在

typing.py
中用于
CPython
。在我的测试中,用任何其他字符串替换该字符串似乎不会破坏任何内容。

python python-typing
1个回答
11
投票

__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__
最好更有意义:)

© www.soinside.com 2019 - 2024. All rights reserved.