代码风格 - 用于if

时间:2015-06-24 08:24:48

标签: python coding-style

您认为三者中的哪一种是更好的编码风格,还是更具可读性?应该对两个词典中的项目运行foo,但mydict2可以是None

选项1:

for a,b in mydict1.items():
    foo(a,b) 
if mydict2:
    for a,b in mydict2.items():
        foo(a,b)

选项2:

for a,b in mydict1.items():
    foo(a,b)
for a,b in mydict2.items() if mydict2 else dict().items():
    foo(a,b)

选项3:

for a,b in chain(mydict1.items(), mydict2.items() if mydict2 else dict().items()):
    foo(a,b)

2 个答案:

答案 0 :(得分:6)

请尽早检测旁边情况,并将其替换为空字典 - 这是null object pattern

if mydict2 is None:
     mydict2 = {}

这与用于避免可变默认参数的常见模式相同。然后你总是可以有一个(非常简单的)循环:

for a, b in chain(mydict.items(), mydict2.items()):

如果您控制相关代码,请考虑更改内容,以便mydict2首先不能None

答案 1 :(得分:2)

我喜欢第三种选择,因为单循环使程序的意图更清晰。如果是我,我会做一个辅助发电机,为了分离问题。

def mydictitems(*dicts):
    for d in dicts:
         if d:
              yield from d.items()

for a,b in mydictitems(mydict1, mydict2):
    foo(a,b)