python-3.x 如何使用mypy与辅助函数

9rygscc1  于 2023-11-20  发布在  Python
关注(0)|答案(2)|浏览(196)

我有一个函数my_function,它有两个参数,xmethod。根据method的值,将使用两个独立函数之一,func1func2。这两个函数以x为参数:func1期望它是一个整数,而func2期望它是一个浮点数。这两个函数可以由用户独立使用,因此可以检查x的类型,如果类型错误,则会引发错误。下面是我的代码和类型提示:

from typing import Literal

def func1(x: int):
    """Perform some work on integers."""
    if not isinstance(x, int):
        raise ValueError("x should be an integer.")
    
    # Do some stuff.

def func2(x: float):
    """Perform some work on floats."""
    if not isinstance(x, float):
        raise ValueError("x should be a float.")
    
    # Do some stuff.

def my_function(x: int | float, method: Literal[1, 2]):
    """Perform some work using one of two methods."""

    match method:
        case 1:
            result = func1(x)
        case 2:
            result = func2(x)
        case _:
            raise ValueError(f"Invalid method: {method}.")

    # Do some more work on result.

    return result

字符串
Mypy将在调用func1时引发错误,因为x中的int | float类型与helper1中的预期类型int不兼容。推荐的方法是什么?我应该在调用func1func2之前重复my_function中的类型检查吗?

编辑:我应该注意到,我不想简单地依赖于my_function中的x的类型来选择函数,因为用户很容易混淆整数和浮点数(例如,通过省略1.0中的.0)。

d8tt03nd

d8tt03nd1#

由于helper1()中的参数可以接受int或float类型的x,因此您也应该使用def helper1(x: int | float):。这将满足mypy并满足代码的期望。helper2()也是如此。

4uqofj5v

4uqofj5v2#

我理解你的担心。但是即使使用if type()也可以实现。

import math

def my_function(x):
    cond = type(x) == int or type(x) == float

    if cond:
        flr = math.floor(x)
        if x % flr == 0:
            result = func1(x)
        
        else:
            result = func2(x)
     else:
        return 'Invalid Method'

    #perform some task with result here

字符串
这里的想法是,而不是要求机器来决定数字是整数还是浮点数,我们在编码中也做了这一部分。从参数,离开小数部分,让我们取整数部分。如果它是小数,如果我们用整数部分除以数字,就会有提醒。然而,如果它是非小数,就不会有任何提醒。
当你把它分成两个函数时,我也是这么做的。只要你没有在my_function之外的任何地方使用funct1和funct2,你就不需要创建funct1和funct2。它们可以集成在my_function本身中。

相关问题