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 块限制在循环的头部吗?
这取决于您是否认为 arg
是 None
是一个错误。
如果它是受支持的值,这意味着没有任何工作要做,那么根据您的第一个解决方案检查它并返回是最有意义的。
如果它永远不应该是 None
并且有人传递它是一个错误,那么就让异常发生吧。或者,我个人的选择,检查它并在 __init__
中抛出一个异常来说明调用者传递了一个无效参数。较早发生的异常(在无效事件发生时)感觉比后来发生的异常要好,一旦发生了一堆其他事情并且更难弄清楚。
我这样定义一个可迭代对象:
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 块限制在循环的头部吗?
这取决于您是否认为 arg
是 None
是一个错误。
如果它是受支持的值,这意味着没有任何工作要做,那么根据您的第一个解决方案检查它并返回是最有意义的。
如果它永远不应该是 None
并且有人传递它是一个错误,那么就让异常发生吧。或者,我个人的选择,检查它并在 __init__
中抛出一个异常来说明调用者传递了一个无效参数。较早发生的异常(在无效事件发生时)感觉比后来发生的异常要好,一旦发生了一堆其他事情并且更难弄清楚。