【问题标题】:Purpose of __name__ in TypeVar, NewType__name__ 在 TypeVar、NewType 中的用途
【发布时间】:2018-07-03 04:17:50
【问题描述】:

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

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

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

但是,我真的不知道这最终是如何在typing.pyCPython 中使用的。用任何其他字符串替换字符串似乎不会破坏我的测试中的任何内容。

【问题讨论】:

  • 它相当于一个适当类的类名,例如T 中的 class T: pass。声明 TypeVar 不会在运行时设置类名,因此我们通过提供名称标签来帮助自己,让我们可以访问 TypeVar 完全相同的名称。但是,正如您正确注意到的那样,没有什么能迫使我们这样做。这是否清楚,或者您的问题是否意味着不同?
  • 嗨阿恩!您是否熟悉以某种方式设置名称属性的任何用例?在我看来,__name__ 在模块级别最有用,我们在其中进行导入和无处不在的if __name__ == "__main__": pass。对于类名,每当我调用或实例化类时,我都必须使用它,但对于TypeVarNewType,这是通过分配的变量名完成的,所以在键入函数的上下文中,如何使用的属性?

标签: python python-3.6 type-hinting


【解决方案1】:

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

【讨论】:

  • 这真的很有用,它清除了很多关于如何使用类型提示的可能。非常感谢!
猜你喜欢
  • 2020-03-04
  • 2012-02-20
  • 2017-04-19
  • 2020-06-23
  • 1970-01-01
  • 2010-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多