我有一个接受 3 个参数的函数,我想确保这三个参数都是数字。
截至目前,我经过一番实验后做到了这一点,它似乎有效,但我不确定,因为我不太了解布尔运算符的优先级/优先级
assert type(x)==type(y)==type(z) in (int, float), "Please provide numbers"
我正在寻找的是:
== 运算符的优先级高于 in 运算符:
assert (type(x) == type(y) == type(z)) and isinstance(x, (int, float)), "Please provide numbers"
其他一切对我来说都很好。
所有比较运算符(包括成员运算符)在 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".