Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
赋值的布尔求值的Python习语_Python - Fatal编程技术网

赋值的布尔求值的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

以下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[]){

    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:同意。顺便说一句,我认为你的答案很好(我投了赞成票)。我将此作为替代方案。这只是你个人的喜好,你宁愿在一段时间后阅读。嗯,更一般地说,任何形式的表达式都不能包含赋值。嗯,更一般地说,任何形式的表达式都不能包含赋值。