现在,我的代码中有些内容如下所示:
def f(x):
if x == 5:
raise ValueError
else:
return 2 * x
interesting_values = range(10)
result = []
for i in interesting_values:
try:
result.append(f(i))
except ValueError:
pass
Run Code Online (Sandbox Code Playgroud)
f实际上是一个更复杂的函数,它以不可预测的方式针对特定的值失败(f(x)在尝试之前,我不知道是否会失败)。
我对此感兴趣的是result:的所有有效结果的列表f。
我想知道是否有办法使第二部分像列表理解一样。当然,我不能简单地做到这一点:
def f(x):
if x == 5:
raise ValueError
else:
return 2 * x
interesting_values = range(10)
result = [f(i) for i in interesting_values]
Run Code Online (Sandbox Code Playgroud)
因为对call的调用f(5)将使所有操作失败,但是也许有一种方法可以将try-except结构集成到列表推导中。是这样吗
编辑:我可以控制f。
似乎您可以控制f并可以修改其处理错误的方式。
如果是这种情况,并且None不是该函数的有效输出,我希望它返回None错误而不是抛出:
def f(x):
if x == 5: return None
else: return 2*x
Run Code Online (Sandbox Code Playgroud)
然后对其进行过滤:
results = (f(x) for x in interesting_values) # A generator expression; almost a list comptehension
valid_results = filter(lambda x: x is not None, results)
Run Code Online (Sandbox Code Playgroud)
这是通常称为“可选模式”的精简版本。如果出现错误,则返回一个特殊的警戒值(None在这种情况下),否则,返回一个有效值。通常,Optional类型是一种特殊类型,而sentinal值是该类型的子类(或类似的东西),但这在这里不是必需的。