【问题标题】:Difference between TypeVar('T') and AnyTypeVar('T') 和 Any 之间的区别
【发布时间】:2020-12-09 23:11:13
【问题描述】:

假设我有一些通用功能:

def foo(*args):
    for arg in args:
        print(arg)

如果我想输入提示*args,根据PEP我只需要指定类型一个arg。

如果参数可以是任何类型怎么办?有什么区别:

T = typing.TypeVar('T')

def foo(*args: T):
    ...

def foo(*args: Any):
    ...

据我所知,TypeVar('T') 等同于“任何类型”,但是当变量 args 具有多种类型时,这是否适用?

【问题讨论】:

  • 使用TypeVar,您可以在类型之间建立连接。只是TypeVar('T') 本身只表示与Any 相同,def foo(*args: T) -> T 表示foo 返回的类型与它得到的相同,你不能用Any 表达...
  • @deceze 如果返回None,那有没有区别?如果是这样,我更喜欢使用Any,因为它对未来的读者来说是不言自明的。
  • 简短的回答是,如果您只在一个地方使用该类型并且您没有 bounding 它,那么使用 TypeVar 并没有任何意义。

标签: python types type-hinting typing type-annotation


【解决方案1】:

人们可能认为区别在于:

foo(*args: T) 表示函数可以接受任意数量的参数,并且参数可以是任何类型,但必须都是相同的类型。

foo(*args: Any) 表示该函数可以接受任意数量的任意类型参数。

但实际上并非如此:https://github.com/python/mypy/issues/6559#issuecomment-473864640

实际上这两种定义没有区别

【讨论】:

  • 对于你之前的观点,我认为这就是它的意思(任何类型,但都一样),但例如调用 foo('a', 1, ['a', 1]) 时,linter 不会抛出错误。
  • @pasta_sauce 嗯,没错,mypy 似乎并不认为这是一个错误。要么我错过了什么,要么是一个错误。
  • @pasta_sauce 好像我错了github.com/python/mypy/issues/6559
  • 除非您以某种方式进一步缩小范围(例如,使用bound 或在Generic 中使用TypeVar 以便调用者可以缩小范围),类型可以是任意宽泛。如果您将T 替换为Union[str, int, List[Union[str, int]]],则上述用法会进行类型检查。
  • @Samwise Ofc,但这里没有问。
猜你喜欢
  • 1970-01-01
  • 2018-08-23
  • 2021-01-30
  • 1970-01-01
  • 2015-11-15
  • 1970-01-01
  • 2011-05-15
  • 1970-01-01
相关资源
最近更新 更多