验证函数参数是否为数字的好方法是什么

问题描述 投票:0回答:2

我有一个接受 3 个参数的函数,我想确保这三个参数都是数字。

截至目前,我经过一番实验后做到了这一点,它似乎有效,但我不确定,因为我不太了解布尔运算符的优先级/优先级

assert type(x)==type(y)==type(z) in (int, float), "Please provide numbers"

我正在寻找的是:

  • 确认我的代码是否有效
  • 有更好的方法吗? (我有点新,所以也许我错过了一些明显且众所周知的东西:/)
python-3.x assert boolean-expression
2个回答
0
投票

== 运算符的优先级高于 in 运算符:

assert (type(x) == type(y) == type(z)) and isinstance(x, (int, float)), "Please provide numbers"

其他一切对我来说都很好。


0
投票

所有比较运算符(包括成员运算符)在 Python 中具有相同的优先级,并且具有从左到右的链接,因此链接的比较将是等效的(不同之处在于,如果不链接,则表达式会被多次求值) )到:

type(x) == type(y) and type(y) == type(z) and type(z) in (int, float).

由于它们都具有相同的优先级,因此求值顺序是从左到右。

这样做的主要问题是,如果您想允许某些参数为整数而其他参数为浮点数,则它们将不会被验证:

>>> x, y, z = 3, 2.1, 7
>>> assert type(x)==type(y)==type(z) in (int, float), "Please provide numbers"

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError: Please provide numbers

如果两种类型的参数混合有效,则必须修改条件。一个明显的选择是对所有参数使用

type(arg) in (int, float)

另一方面,经常使用

isinstance
代替
type
,因为它也允许验证子类的实例,这通常是常态。

assert isinstance(x, (int, float)) and isinstance(y, (int, float)) and isinstance(z, (int, float)), "Please provide numbers".

或更简洁:

assert all(isinstance(arg, (int, float)) for arg in (x, y, z)), "Please provide numbers".
© www.soinside.com 2019 - 2024. All rights reserved.