代码风格 - for与if连用

5
你认为哪种编码风格更好,更易读?运行foo函数时需要两个字典中的项,但是mydict2可以为空。

选项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)

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

你知道如果mydict2.items()是空的,那么遍历它就什么也做不了吗?三元表达式完全是多余的。 - jonrsharpe
@jonsharpe 但是原帖中提到它可能是 None。尝试迭代 None 会抛出错误。 - Sam
@Sam 那么他们应该通过身份测试 - if mydict2 is not None - jonrsharpe
2个回答

6

早期检测侧面案件,并用空字典替换它 - 这就是null object pattern

if mydict2 is None:
     mydict2 = {}

这与避免可变默认参数的常见模式相同。这样,您总是可以有一个(非常简单)的循环:
for a, b in chain(mydict.items(), mydict2.items()):

如果您控制相关代码,请考虑更改代码,以便在第一次出现时mydict2不会是None


2

我喜欢第三个选项,因为单循环使程序的意图更清晰。如果是我的话,我会制作一个帮助器生成器,以便分离关注点。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接