mypy,type提示:Union [float,int] - >是否有Number类型?

JPF*_*oia 28 python type-hinting mypy

mypy非常方便并且捕获了很多错误,但是当我编写"科学"应用程序时,我经常最终会这样做:

def my_func(number: Union[float, int]):
    # Do something
Run Code Online (Sandbox Code Playgroud)

number是浮点数还是int,具体取决于用户的输入.有官方的方法吗?

Mar*_*ers 35

float 仅限使用,如int该类型所暗示:

def my_func(number: float):
Run Code Online (Sandbox Code Playgroud)

PEP 484 类型提示明确指出:

而不是要求用户编写导入数字然后使用numbers.Float等,这个PEP提出了一个简单的快捷方式,几乎同样有效:当一个参数被注释为具有类型时float,类型的参数int是可接受的 ; 类似地,对于注释为具有类型复杂的参数,可以接受float或int类型的参数.

(大胆强调我的).

理想情况下你仍然会使用numbers.Real:

from numbers import Real

def my_func(number: Real):
Run Code Online (Sandbox Code Playgroud)

因为那会接受fractions.Fraction()decimal.Decimal()反对; 数字金字塔不仅仅是整数和浮点值.

但是,当mypy用于进行类型检查时,这些当前不起作用,请参阅Mypy#3186.

  • 与切线相关,但是“十进制”实际上不是“真实”的子类,也不是数字塔的一部分:https://www.python.org/dev/peps/pep-3141/#the-decimal-type (2认同)

Sup*_*ova 18

Python >3.10允许您执行以下操作。

def my_func(number: int | float) -> int | float: 
Run Code Online (Sandbox Code Playgroud)

  • @AlexWaygood 虽然该声明在大多数情况下都是正确的,但说类型联合通常毫无意义是错误的。一般来说,“int”和“float”是不同的东西,如果您的代码需要在本地区分这些差异,则类型联合是合适的。例如,看看“dir(1)”与“dir(1.0)”。如果您需要在任一成员函数上定义的任何成员函数,则需要类型联合,以便代码能够正确进行类型检查。 (7认同)
  • 正如 Martijn 的回答指出的那样,mypy 文档明确指出“当参数被注释为具有 float 类型时,int 类型的参数是可接受的”。在这里显式注释联合是没有意义的。 (3认同)

小智 12

您可以定义自己的类型来解决此问题并保持代码简洁。

FloatInt = Union[float, int]

def my_func(number: FloatInt):
    # Do something
Run Code Online (Sandbox Code Playgroud)

  • 好主意,但是当存在“float”时,“int”正式是多余的。请参阅此答案:/sf/answers/3565003921/ (4认同)