runtim中的复变量参数检查

2024-04-28 15:42:58 发布

您现在位置:Python中文网/ 问答频道 /正文

让我们考虑这样一个函数:

def f(*args, **kwargs):
   ...

*args是数量可变的参数,必须: (一个物体,一个浮点数,一个浮点数),可能重复N次, 后跟0到N'个对象

例如,这是一个有效的调用:

f(my_obj, 0, 1, other_obj, 2, 3, obj3, obj4)

但这是无效的:

f(my_obj, other_obj, 2, 3)

此函数通过Python shell向用户公开。 所以,检查用户输入是有价值的——我正在使用 使用类型注释的typeguard库 (像mypy)

我正在尝试使用typing模块来编写正确的注释。。。 我想我至少可以表达3个参数组的约束 像这样:

@typeguard.typechecked
f(*args:Tuple[Any,float,float])

但它不起作用。 无论如何,我不知道如何在下面的对象上添加约束

当然,我可以自己编写一些代码来检查参数,但我确信对于复杂变量参数序列的情况,存在更好的方法(或者巧妙地使用typing模块,或者另一个Python库?)


Tags: 模块对象函数objtyping参数数量my
1条回答
网友
1楼 · 发布于 2024-04-28 15:42:58

我所说的验证是指:

def _validate(a, b, c):
    assert isinstance(b, float), f"{b} is not a float!"
    assert isinstance(c, float), f"{c} is not a float"

def _validate_args(args):
  if (len(args) % 3 != 0): # wrong number of args
    raise ValueError("Arguments must be passed in pack of 3")
  for idx in range(0, len(args), 3):
      a, b, c = args[idx: idx + 3]
      _validate(a, b, c)

def func(*args, **kwargs):
  _validate_args(args)

func(1, 2.0, 3, 1, 2, 3)

AssertionError: 3 is not a float

你想说什么就说什么

相关问题 更多 >