背景是我正在为一个可行的项目包装器脚本工作。我必须检查很多None
返回值,我只是想知道是否有一个简短的python版本?
将标准配置替换为文件中的配置,仅当该文件可用时
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
。一般来说,你不应该使用相等来比较少量的内置单例,比如None
和True
。然而,在True
和False
的情况下,您几乎不应该首先比较它们。请注意,这里不会出现需要注意的情况,因为除了False
之外,没有布尔值是假的。)
当然,无论哪种方式,如果你想要更简洁的东西,你总是可以把它包装在一个函数中。由于您展示了四个完全不同的示例,因此很难看出如何使其具有可读性,但如果这让您感到厌烦,可能是因为您连续编写了十几次相同的内容。不管这个东西是什么,把它包装成一个函数。
还有,看看defaultdict
;我怀疑它可能会使您的一些用例更简单。