我在下面写了一些这种结构的代码。
if ....:
if ....:
....
else:
....
一个简短的例子
if name in name_dict:
info = name_dict['name'] ## <-- may be a more complicated function
if info == '':
info = input("Input your info: ")
else:
info = input("Input your info: ")
它看起来非pythonic,而yapf
总是将代码缩进为:
if ....:
if ....:
....
else:
....
我尝试将代码重写为这种形式:
if .... and ....:
....
else:
....
通过这种方式,上面的示例可以转换为:
if (name in name_dict) and name_dict['name'] != '':
info = name_dict['name']
else:
info = input("Input your info: ")
但是在重写代码中会执行两次函数name_dict['name']
,因此它不是一个有效的解决方案。
我想知道是否有任何pythonic方法可以重写此代码块,而不会增加复杂性。
答案 0 :(得分:1)
您可以在此处使用dict.get()
:
if name_dict.get(name):
info = name_dict['name']
else:
info = input("Input your info: ")
name_dict.get(name)
仅在name
作为name_dict
,和中的键存在时才会为真,与该键相关联的值不是空值({ {1}}在布尔上下文中为false,如果缺少''
,则返回name
,这也是一个假值。)
这两行可与None
合并,完全取消or
声明:
if
那是因为info = name_dict.get(name) or input("Input your info: ")
短路。如果or
生成非空值,则不会调用name_dict.get(name)
函数。
答案 1 :(得分:0)
我终于明白了。我正在寻找Python 3.8中的赋值表达式。
if name in name_dict:
info = name_dict['name'] ## <-- may be a more complicated function
if info == '':
info = input("Input your info: ")
else:
info = input("Input your info: ")
可以变成:
if (name not in name_dict) or (name in name_dict and (info := name_dict['name']) == ''):
info = input("Input your info: ")
就像用自然语言表达逻辑一样。 “如果名称不在词典中,或者名称在词典中为空,请输入一些信息。”