处理返回值中可选的None结果



背景是我正在为一个可行的项目包装器脚本工作。我必须检查很多None返回值,我只是想知道是否有一个简短的python版本?

示例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) kinda ?:样式。

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;我怀疑它可能会使您的一些用例更简单。

最新更新