Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python mypy:为什么是;int";“的一种亚型;浮动;? 为什么“MyPy”把“int”看作“浮点”的子类型?子类型应支持其超类型的所有方法,但“float”具有“int”不支持的方法:_Python_Mypy - Fatal编程技术网

Python mypy:为什么是;int";“的一种亚型;浮动;? 为什么“MyPy”把“int”看作“浮点”的子类型?子类型应支持其超类型的所有方法,但“float”具有“int”不支持的方法:

Python mypy:为什么是;int";“的一种亚型;浮动;? 为什么“MyPy”把“int”看作“浮点”的子类型?子类型应支持其超类型的所有方法,但“float”具有“int”不支持的方法:,python,mypy,Python,Mypy,test.py: def f(x : float) -> bool: return x.is_integer() print(f(123.0)) print(f(123)) 静态类型检查器接受为“float”参数传递“int”参数: (3.8.1) myhost% mypy test.py Success: no issues found in 1 source file 但这并不能保证在运行时没有错误: (3.8.1) myhost% python test.py True

test.py:

def f(x : float) -> bool:
    return x.is_integer()

print(f(123.0))
print(f(123))
静态类型检查器接受为“float”参数传递“int”参数:

(3.8.1) myhost% mypy test.py
Success: no issues found in 1 source file
但这并不能保证在运行时没有错误:

(3.8.1) myhost% python test.py
True
Traceback (most recent call last):
  File "test.py", line 5, in <module>
    print(f(123))
  File "test.py", line 2, in f
    return x.is_integer()
AttributeError: 'int' object has no attribute 'is_integer'
(3.8.1)myhost%python test.py
真的
回溯(最近一次呼叫最后一次):
文件“test.py”,第5行,在
印刷品(f(123))
文件“test.py”,第2行,在f中
返回x.is_integer()
AttributeError:'int'对象没有属性'is\u integer'

因为“float”有额外的方法,而“int”没有。

正如juanpa.arrivillaga所指出的,解释还在继续

子类型应支持其超类型的所有方法,但“float”具有“int”不支持的方法

int
不是
float
的子类型,因此它不必支持
float
的方法

这种机制很好,因为传递整数值不应该导致错误,除非您真的希望像示例中那样传递它们。您明确尝试使用不存在的方法。在一般情况下,我们只对数字进行算术运算,因此问题很少存在,您可以通过在编写时添加
.0
来避免它

大多数语言中的一种常见行为是:<代码> int >代码>是代码>浮点< /C> >的特殊情况,例如考虑C++ <代码> INT/COM> > <代码>浮点隐式转换。“MyPy”为什么认为“int”是“浮点”的一个子类型? 因为到目前为止,实用性被认为比纯洁性更重要。这并不是说不能建议键入定义一个标量类型,该类型将包括int和float,但仅对算术运算有效

请注意,int/int在3.0中进行了更改,使float(int/int)=float(int)/float(int),以使int和float算术在int和float值相等时保持一致


还要注意,类型检查通过并不意味着没有运行时错误:除零和溢出,以及许多其他错误仍然是可能的。

哦,哇,这对我来说似乎很糟糕,这里的解释是:@BlackFrog不,它不能。@BlackFrog An
int
不能放入浮点。Python
int
s不是机器
int
s。(无论如何,我不确定这与类型检查有什么关系,因为类型检查并不真正关心类型的运行时表示。)除非我遗漏了什么,否则将duck类型与
int
float
一起使用的基本原理似乎完全忽略了这两种类型都有方法的事实,或者至少是除
\uuuuu add\uuuuu
等方法之外的其他方法。@StefanPochmann是的,但如图所示,从类型系统POV来看,这并不是什么难事,它说“您总是可以通过使用正确的类型来避免它”对于类型检查器是错误的,这对我来说不是一个令人信服的论据。静态类型的全部要点就是避免使用未为类型定义的方法。答案的第一部分很好;继续解释为什么没有负面影响只会对每个人造成伤害。