我有一个函数my_function
,它有两个参数,x
和method
。根据method
的值,将使用两个独立函数之一,func1
和func2
。这两个函数以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
不兼容。推荐的方法是什么?我应该在调用func1
和func2
之前重复my_function
中的类型检查吗?
编辑:我应该注意到,我不想简单地依赖于my_function
中的x
的类型来选择函数,因为用户很容易混淆整数和浮点数(例如,通过省略1.0
中的.0
)。
2条答案
按热度按时间d8tt03nd1#
由于
helper1()
中的参数可以接受int或float类型的x,因此您也应该使用def helper1(x: int | float):
。这将满足mypy并满足代码的期望。helper2()
也是如此。4uqofj5v2#
我理解你的担心。但是即使使用if type()也可以实现。
字符串
这里的想法是,而不是要求机器来决定数字是整数还是浮点数,我们在编码中也做了这一部分。从参数,离开小数部分,让我们取整数部分。如果它是小数,如果我们用整数部分除以数字,就会有提醒。然而,如果它是非小数,就不会有任何提醒。
当你把它分成两个函数时,我也是这么做的。只要你没有在my_function之外的任何地方使用funct1和funct2,你就不需要创建funct1和funct2。它们可以集成在my_function本身中。