单行保存if语句的价值?

时间:2016-08-01 13:46:58

标签: python variables if-statement

有没有一种聪明的方法可以用三行或四行编写以下代码?

a=l["artist"]
if a:
    b=a["projects"]
    if b:
        c=b["project"]
        if c:
            print c

所以我想像伪代码那样:

a = l["artist"] if True:

5 个答案:

答案 0 :(得分:8)

怎么样:

try:
    print l["artist"]["projects"]["project"]
except KeyError:
    pass
except TypeError:
    pass # None["key"] raises TypeError. 

此值为tryprint,但如果引发KeyError,则会运行except块。 pass意味着什么都不做。这是众所周知的和EAFP: E 更强 A sk F orgiveness比 P 错误。

答案 1 :(得分:5)

我不一定认为这样做会更好,但你可以做到:

try:
    c = l["artist"]["projects"]["project"]
except (KeyError, TypeError) as e:
    print e
    pass

答案 2 :(得分:0)

p = l.get('artist') and l['artist'].get('projects') and l['artist']['projects'].get('project')
if p:
     print p

您还可以为此目的制作更通用的功能:

def get_attr(lst, attr):
    current = lst
    for a in attr:
        if current.get(a) is not None:
            current = current.get(a)
        else:
            break
    return current

>>> l = {'artist':{'projects':{'project':1625}}}
>>> get_attr(l,['artist','projects','project'])
1625

答案 3 :(得分:0)

单行(如标题中所示),无例外:

{{1}}

答案 4 :(得分:0)

由于您正在处理嵌套字典,因此您可能会发现这种通用的单行有用,因为它允许您通过传递更多keys个参数来访问任何级别的值:

nested_dict_get = lambda item, *keys: reduce(lambda d, k: d.get(k), keys, item)

l = {'artist': {'projects': {'project': 'the_value'}}}

print( nested_dict_get(l, 'artist', 'projects', 'project') ) # -> the_value

注意:在Python 3中,您需要在顶部添加from functools import reduce