擅长:python、mysql、java
<p>假设<code>None</code>是函数唯一可能的错误输出,您可以将它们视为布尔ish并使用<code>or</code>进行回退,例如</p>
<pre class="lang-py prettyprint-override"><code>res = geopy_parse(address_str) or libpostal_parse(address_str) or google_maps_parse(address_str)
</code></pre>
<p>将返回第一个非虚假结果</p>
<p>您也可以使用<code>next()</code>以获得更大的灵活性,但这有点复杂,因为您必须在将iterable馈送到下一个之前过滤掉falsy值,例如</p>
<pre class="lang-py prettyprint-override"><code>res = next(filter(None, (
fn(address_str)
for fn in [geopy_parse, libpostal_parse, google_maps_parse]
)), None)
</code></pre>
<p><code>filter(None, iterable)</code>与<code>filter(lambda a: a, iterable)</code>等效,但比<code>filter(lambda a: a, iterable)</code>更有效,它将从iterable(lazy)中删除所有错误项</p>
<p>因此,它将函数作为输入,尝试将每个函数应用于输入,只保留真实结果,然后返回第一个这样的结果(这就是<code>next()</code>所做的)</p>
<p>因为它只使用惰性构造(生成器和过滤器),所以它只在前面的构造都不合适的情况下计算函数</p>