处理返回值的可选无结果

时间:2014-07-28 20:59:56

标签: python

背景是我正在a wrapper script处理一个ansible项目。我必须检查很多None返回值,我只是想知道是否有一个简短的pythonic版本吗?

示例1

使用文件中的配置替换标准配置,仅当此文件可用时

def deploy(environment, version):
    config = {
        # Some values
    }

    local_config = get_config('deploy.cnf', environment)
    if local_config != None:
        config = local_config

    # More code...

def get_config(path, environment):
    if os.path.isfile(path):
        parser = SafeConfigParser()
        parser.read(path);
        if parser.has_section(environment):
            config = {
                # Create config...
            }
            return config

示例2

仅在明确传递version时,使用此替换版本

def deploy(environment, version):
    config = {
        'version': version,
        'force': force,
    }

    # Config might be replaced (see example 1)

    # The version is given by command option,
    # let this overwrite the config's version
    if version != None:
        config['version'] = version

示例3

仅在get_latest_tag()返回实际结果时替换配置中的版本

result = get_latest_tag()
if result != None:
    config['version'] = result

问题

我经常看到自己在python中执行if x != None: y = x之类的操作。我来自php世界,我的直觉是这可以在python中做得更好。有什么办法吗?

在php中我会写一些像:

$foo = $bar ?: 'default';

然而,这种类型的短三元在python中不存在,python中的可用三元组(afaik)不支持有点?:样式。

1 个答案:

答案 0 :(得分:2)

Python的等价物

$bar ?: 'default'

是:

bar if bar else 'default'

但是,如果bar可能不是None,而是假的,请False或数字0或空序列,请务必小心。如果您不确定无法发生,请明确:

spam if spam is not None else 'default'

(请注意,我使用is not None而不是!= None。一般情况下,您不应该使用相等来比较少数内置单例,例如NoneTrue但是,在TrueFalse的情况下,你几乎不应该首先比较它们。请注意,要小心的情况不会出现在那里,因为那里没有布尔值是假的,但不是False。)

当然,无论哪种方式,如果你想要一些不那么冗长的东西,你总是可以将它包装在一个函数中。既然你展示了四个完全不同的例子,很难看出如何让它变得可读,但是如果这让你感到烦恼,那就是因为你在同一个东西中写了十几次相同的东西。行。不管是什么东西,把它作为一个功能包装起来。

另外,请看defaultdict;我怀疑它可能会使你的一些用例变得更简单。