赋值的布尔求值的Python习语
以下C程序是我希望能够在python中实现的一个示例:赋值的布尔求值的Python习语,python,Python,以下C程序是我希望能够在python中实现的一个示例: foo@foo:~/$ cat test.c #include <stdio.h> #include <stdlib.h> #include <stdbool.h> bool get_false(){ return false; } bool get_true(){ return true; } void main(int argc, char* argv[]){ boo
foo@foo:~/$ cat test.c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
bool get_false(){
return false;
}
bool get_true(){
return true;
}
void main(int argc, char* argv[]){
bool x, y;
if ( x = get_false() ){
printf("Whiskey. Tango. Foxtrot.\n");
}
if ( y = get_true() ){
printf("Nothing to see here, keep moving.\n");
}
}
foo@foo:~/$ gcc test.c -o test
test.c: In function ‘main’:
test.c:13: warning: return type of ‘main’ is not ‘int’
foo@foo:~/$ ./test
Nothing to see here, keep moving.
foo@foo:~/$
为什么??因为我想说:
if not (x=get_false()): x={}
基本上,我正在处理一个糟糕的API,其中返回的类型要么是数据可用时的dict,要么是False。是的,一个有效的答案是返回一致的类型,并对故障模式指示器使用异常而不是False。不过,我无法更改底层API,而且我在Python等具有动态类型的环境中经常遇到这种模式(阅读:函数/方法接口没有严格的类型)
关于如何减少if/else开销有什么建议吗?您可以使用
x = get_false() or {}
如果get_false()
返回一个false
值,Python将返回或
的第二个操作数
请参阅Python参考手册的第页。(从那时起就一直存在)。您可以使用
x = get_false() or {}
如果get_false()
返回一个false
值,Python将返回或
的第二个操作数
请参阅Python参考手册的第页。(从那时起就已经存在了)。您可以使用Python来实现这一点:
>>> data=False # could be data=readyourapi()
>>> x=data if data else {}
>>> x
{}
您可以使用Python实现这一点:
>>> data=False # could be data=readyourapi()
>>> x=data if data else {}
>>> x
{}
您将一个不方便的API与重复的错误修补代码结合起来,从而使您试图避免的问题更加复杂
def wrapper():
x = get_false()
if not x:
x = dict()
return x
这样,您的代码就不会充斥着难以阅读的三元(或类似三元)操作,如果您觉得更合适,您可以更改包装器以引发异常
你不能做的是把赋值作为条件赋值,就像在C中一样;Python没有做到这一点。您正在将一个不方便的API与重复的错误修补代码结合起来,从而使您试图避免的问题更加复杂
def wrapper():
x = get_false()
if not x:
x = dict()
return x
这样,您的代码就不会充斥着难以阅读的三元(或类似三元)操作,如果您觉得更合适,您可以更改包装器以引发异常
你不能做的是把赋值作为条件赋值,就像在C中一样;Python不会这样做。定义更新的…3+?链接到变更日志会很有帮助,谢谢。我已经编辑了我的答案。它至少从2.0版开始出现,这(希望)是您必须担心的Python的最早版本?链接到变更日志会很有帮助,谢谢。我已经编辑了我的答案。它至少从2.0版开始出现,这(希望)是您必须担心的Python的最早版本;如果不是数据:data={}@nneonneo:我认为字符数不是测试的标准。它是如何由第三方(或你在几个月内)我可以考虑<代码>数据=函数()的可读性;如果不是数据:data={}要合理可读,至少相当于三元溶液
data=func()或{}
有点晦涩难懂,但在许多其他语言(如Perl、Ruby、JS)中,这是一个标准的习惯用法。它在Python中并不经常需要。@nneonno:同意。顺便说一句,我认为你的答案很好(我投了赞成票)。我将此作为替代方案。这只是你个人的喜好,你宁愿在一段时间后阅读,只要data=func();如果不是数据:data={}
@nneonneo:我认为字符数不是测试的标准。它是如何由第三方(或你在几个月内)我可以考虑<代码>数据=函数()的可读性;如果不是数据:data={}要合理可读,至少相当于三元溶液data=func()或{}
有点晦涩难懂,但在许多其他语言(如Perl、Ruby、JS)中,这是一个标准的习惯用法。它在Python中并不经常需要。@nneonno:同意。顺便说一句,我认为你的答案很好(我投了赞成票)。我将此作为替代方案。这只是你个人的喜好,你宁愿在一段时间后阅读。嗯,更一般地说,任何形式的表达式都不能包含赋值。嗯,更一般地说,任何形式的表达式都不能包含赋值。