TypeVar、NewType 中 __name__ 的用途
Purpose of __name__ in TypeVar, NewType
在 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
由于它们的主要目的是调试,因此不限制 type.__name__
和您用来处理它的名称标签之间的一致性。
对于其他用例,您还可以检查用于输入提示的任何对象的 __annotations__
成员中的类型,例如
print(test_func.__annotations__)
>> {'arg': ~not_T}
并使用它在您的代码中实施进一步的类型检查或处理 - 在这种情况下,您的 TypeVar.__name__
最好有意义 :)
在 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
由于它们的主要目的是调试,因此不限制 type.__name__
和您用来处理它的名称标签之间的一致性。
对于其他用例,您还可以检查用于输入提示的任何对象的 __annotations__
成员中的类型,例如
print(test_func.__annotations__)
>> {'arg': ~not_T}
并使用它在您的代码中实施进一步的类型检查或处理 - 在这种情况下,您的 TypeVar.__name__
最好有意义 :)