【问题标题】:Loop head inside try-block in pythonpython中try-block内的循环头
【发布时间】:2021-08-20 10:25:48
【问题描述】:

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

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-block 限制在循环的头部吗?

【问题讨论】:

    标签: python for-loop try-catch iterable


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-05-27
      • 1970-01-01
      • 2016-04-06
      • 1970-01-01
      • 2012-09-04
      • 1970-01-01
      • 1970-01-01
      • 2011-06-08
      • 2013-03-03
      相关资源
      最近更新 更多