python 中 try 块内的循环头

Loop head inside try-block in python

我这样定义一个可迭代对象:

class MyClass:
    
    def __init__(self, arg):
        self.arg = arg
        
    def __iter__(self):       
        for item in self.arg:
            yield item

不幸的是 arg 可能是 None。我想知道如何在风格上捕捉到这一点。我能做到:

def __iter__(self):
    if self.arg is None:
        return
    for item in self.arg:
        yield item

但这不符合python的EAFP风格。也许这样:

def __iter__(self):
    try:
        for item in self.arg:
            yield item
    except TypeError:
        return

但这对我来说似乎很危险。实际上,我的循环要复杂得多,我不希望任何其他 TypeErrors 被忽视。我可以将 try 块限制在循环的头部吗?

这取决于您是否认为 argNone 是一个错误。

如果它是受支持的值,这意味着没有任何工作要做,那么根据您的第一个解决方案检查它并返回是最有意义的。

如果它永远不应该是 None 并且有人传递它是一个错误,那么就让异常发生吧。或者,我个人的选择,检查它并在 __init__ 中抛出一个异常来说明调用者传递了一个无效参数。较早发生的异常(在无效事件发生时)感觉比后来发生的异常要好,一旦发生了一堆其他事情并且更难弄清楚。