背景是我正在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)不支持有点?:
样式。
答案 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
。一般情况下,您不应该使用相等来比较少数内置单例,例如None
和True
但是,在True
和False
的情况下,你几乎不应该首先比较它们。请注意,要小心的情况不会出现在那里,因为那里没有布尔值是假的,但不是False
。)
当然,无论哪种方式,如果你想要一些不那么冗长的东西,你总是可以将它包装在一个函数中。既然你展示了四个完全不同的例子,很难看出如何让它变得可读,但是如果这让你感到烦恼,那就是因为你在同一个东西中写了十几次相同的东西。行。不管是什么东西,把它作为一个功能包装起来。
另外,请看defaultdict
;我怀疑它可能会使你的一些用例变得更简单。