我花了一些时间在这里浏览类似命名的问题,但是似乎没有一个解决的问题,如果您有多个退出条件,每个退出条件都有各自的逻辑路径。这就是我的意思。
[我在编写将元素添加到唯一元素链接列表的函数时就开始考虑这个问题:
node = get_prepopulated_list()
# Iterate over linked list until element is found or list is exhausted
while node.key != key and node.next is not None:
node = node.next
# If found element, increment counter for that element
if node.key == key:
node.count += 1
# Else, add new node to end
else:
node.next = Node(key)
注意退出后如何再次检查两个退出条件中的至少一个>,从而导致代码重复。当然,我们可以翻转检查哪个条件,但仍然会保留代码重复。在这种情况下,我们可以使用类似的方法,这样可能会更干净一些:
node = get_prepopulated_list()
# Iterate over linked list until element is found or list is exhausted
while node.key != key and node.next is not None:
try:
node = node.next
# Break out on 'None' condition
except AttributeError:
break
# Use implicit 'None' check from try-except to add new node to end on None
else:
node.next = Node(key)
return
# Otherwise, found element, so increment counter for that element
node.count += 1
但是实际上并没有更好,首先是因为它在else
的while-else
期间添加了必需的转义,其次是因为在循环内添加了一些膨胀的错误处理,最后是因为它破坏了规则2 Python Zen:“显式比隐式更好”。除此之外,它还不能扩展到两个以上的退出条件。
所以我有两个问题:
for item in container:
if test_some_condition(item):
handle_item_found(item)
break
else:
handle_item_not_found()