有没有更优雅的方法来过滤函数的失败结果?

Ann*_*yme 7 python python-3.x

现在,我的代码中有些内容如下所示:

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。

Car*_*ate 6

似乎您可以控制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值是该类型的子类(或类似的东西),但这在这里不是必需的。