为什么mypy不能识别Mapping.get()的参数只是位置参数



方法Mapping.get不接受关键字参数,它们只是位置参数。如果被滥用,为什么mypy没有检测到?

$ mypy --command "a: str = dict(b='yes').get('a', default='no')"
Success: no issues found in 1 source file
$ python
Python 3.9.1 (default, Jan 13 2021, 15:21:08) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> a: str = dict(b='yes').get('a', default='no')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: dict.get() takes no keyword arguments

2016年的一份PR中引入了惯例,以两个下划线开头的论点只适用于mypy。在这样一个基本类型中,是否根本不遵循这种惯例?我想知道为什么。

请注意,PEP 570已经创建,2018年刚刚引入Python 3.8。

许多内置程序不接受关键字参数,请参阅2010年打开的此错误报告。存在的主要原因

  • 开销:内建函数是在C中实现的,解析位置或关键字参数都会带来一些计算开销(尽管这似乎同时得到了缓解(
  • 几乎没有附加值:通常,内置程序具有相当小的函数签名,因此没有kwargs也没什么大不了的
  • 无需求:许多内置程序相对较旧,存在时间较长,但这在过去是一个问题,这是历史性的证据,表明开发人员没有要求拥有kwargs
  • 付出了很多努力:位置参数可以很容易地重命名,它们的范围仅限于函数本身的实现,而不是调用方;夸格语已经成为语言的一部分,需要仔细考虑,因为它们以后很难改变

因此,mypy应该报告错误,但它没有。由于内置存根是在typeshed中键入的,github的typeshed问题跟踪器中有一个打开的错误报告。

最新更新