0

我有以下 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:~/$ 

在 python 中,我知道如何做到这一点的唯一方法是:

foo@foo:~/$ cat test.py
def get_false():
    return False

def get_true():
    return True

if __name__ == '__main__':
    x = get_false()
    if x:
        print "Whiskey. Tango. Foxtrot."

    y = get_true()
    if y:
        print "Nothing to see here, keep moving."

    #if (z = get_false()):
    #    print "Uncommenting this will give me a syntax error."

    #if (a = get_false()) == False:
    #    print "This doesn't work either...also invalid syntax."
foo@foo:~/$ python test.py
Nothing to see here, keep moving.

为什么?因为我想说:

if not (x=get_false()): x={}

基本上我正在解决一个糟糕的 API,其中返回的类型要么是数据可用时的字典,要么是 False。是的,一个有效的答案是返回一致的类型并使用 Exceptions 而不是 False 作为故障模式指示器。不过,我无法更改底层 API,而且我在 Python 等具有动态类型的环境中经常遇到这种模式(阅读:对函数/方法接口没有严格的类型)。

关于如何减少 if/else 开销的任何建议?

4

3 回答 3

5

您可以使用

x = get_false() or {}

应该get_false()返回一个False值,Python 将返回or.

请参阅Python 参考手册的第 5.10 节。(它至少从 Python 2.0 就已经存在了)。

于 2012-09-12T01:03:09.263 回答
1

您正在将不方便的 API 与重复的错误补丁代码混合在一起,从而使您试图避免的问题更加复杂。

def wrapper():
    x = get_false()
    if not x:
        x = dict()
    return x

然后,您的代码不会被难以阅读的三元(或类似三元)操作所困扰,并且如果您发现它更合适,您可以更改包装器以引发异常。

你不能做的是像在 C 中那样有一个条件赋值;Python 不这样做。

于 2012-09-12T03:12:26.687 回答
0

您可以为此使用 Python三元运算符

>>> data=False    # could be data=readyourapi()
>>> x=data if data else {}
>>> x
{}
于 2012-09-12T02:07:58.863 回答