更多'Pythonic'编写非对称if-else语句的方法

时间:2017-10-14 16:50:56

标签: python if-statement

我在下面写了一些这种结构的代码。

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方法可以重写此代码块,而不会增加复杂性。

2 个答案:

答案 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: ")

就像用自然语言表达逻辑一样。 “如果名称不在词典中,或者名称在词典中为空,请输入一些信息。”