TypeVar,NewType中__name__的用途

时间:2018-01-24 07:33:48

标签: python python-3.6 type-hinting

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

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

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

但是,我无法确切地说明typing.py CPython中的{{1}}最终是如何使用的。用任何其他字符串替换字符串似乎不会破坏我的测试中的任何内容。

1 个答案:

答案 0 :(得分:3)

__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

由于它们的主要用途是调试,因此type.__name__与用于处理它的名称标记之间的一致性没有限制。

对于其他用例,您还可以检查用于键入提示的任何对象的__annotations__成员中的类型,例如。

print(test_func.__annotations__)
>> {'arg': ~not_T}

并使用它在代码中实现进一步的类型检查或处理 - 在这种情况下,TypeVar.__name__更有意义:)

相关问题