可能有些人可能认为这是重复的,是的,我发现了很多类似的示例:
但是Pycharm说我可以这样:
if y > x and x != -1:
# do something
我进行了一些搜索,但找不到相似的内容。 我的问题是像这样简化此功能是否正确:
if y > x != -1:
# do something
如果这样的话,它是否安全?除了较短的版本,此版本与非简化版本之间是否有任何区别? 如果不是简化它的正确方法,那是什么?
答案 0 :(得分:3)
这在功能上是等效的,但是在以下情况下:
function Validation(result, res){
if(result.error){
//422 Validation Error
var objError = [];
Object.keys(result.error.details).forEach(function(key) {
objError.push(result.error.details[key]['message']);
});
return res.status(422).json(objError);
}
易于阅读,混合使用不同的运算符以使用链式比较不是最佳选择。
真的一样吗?让我们反汇编一下:
10 < x < 40
结果:
def f1(x,y):
if y > x and x != -1:
return 0
def f2(x,y):
if y > x != -1:
return 0
import dis
print("function 1")
dis.dis(f1)
print("function 2")
dis.dis(f2)
令人惊讶的是它们并不相同,并且链接的版本具有更多说明。
不知道这里发生了什么(有些花了一些时间来更好地解释它:Python Documentation#raise),但实际上我会坚持使用function 1
2 0 LOAD_FAST 1 (y)
3 LOAD_FAST 0 (x)
6 COMPARE_OP 4 (>)
9 POP_JUMP_IF_FALSE 28
12 LOAD_FAST 0 (x)
15 LOAD_CONST 3 (-1)
18 COMPARE_OP 3 (!=)
21 POP_JUMP_IF_FALSE 28
3 24 LOAD_CONST 2 (0)
27 RETURN_VALUE
>> 28 LOAD_CONST 0 (None)
31 RETURN_VALUE
function 2
6 0 LOAD_FAST 1 (y)
3 LOAD_FAST 0 (x)
6 DUP_TOP
7 ROT_THREE
8 COMPARE_OP 4 (>)
11 JUMP_IF_FALSE_OR_POP 23
14 LOAD_CONST 3 (-1)
17 COMPARE_OP 3 (!=)
20 JUMP_FORWARD 2 (to 25)
>> 23 ROT_TWO
24 POP_TOP
>> 25 POP_JUMP_IF_FALSE 32
7 28 LOAD_CONST 2 (0)
31 RETURN_VALUE
>> 32 LOAD_CONST 0 (None)
35 RETURN_VALUE
>>>
版本,该版本具有快捷方式并且可读性强(请考虑一下)未来的维护者...)。
也就是说,关于链式比较的一件有趣的事情是,如果计算中心参数/花费较长时间进行计算/在计算中产生副作用,而又不想将其存储在变量中:>
and
在这种情况下,中心参数仅计算一次。如果是if y > super_long_computation(x) != -1:
,则必须事先存储。