擅长:python、mysql、java
<p>就我个人而言,我只是使用带括号的“原生”Python方式,但在<a href="https://stackoverflow.com/a/63430568/1639625">answer by tdelaney</a>上有一个稍微不同的说法,一个<code>Chain</code>类使用<a href="https://docs.python.org/3/library/functions.html#getattr" rel="nofollow noreferrer">^{<cd2>}</a>来提供<a href="https://docs.python.org/3/library/functions.html#globals" rel="nofollow noreferrer">^{<cd3>}</a>范围中定义的<em>任何</em>函数</p>
<pre><code>class Chain:
def __init__(self, val):
self.val = val
def __getattr__(self, f):
return lambda: Chain(globals()[f](self.val))
def upper(s):
return s.upper()
def pad(s):
return "abc" + s + "xyz"
def swap(s):
return s.swapcase()
print(Chain("foo").upper().pad().swap().val)
# ABCfooXYZ
</code></pre>
<p>或者使用<code>partial</code>和<code>reduce</code>创建一个<code>compose</code>函数(尽管我觉得这样的函数应该已经存在):</p>
<pre><code>from functools import reduce, partial
def compose(*fs):
return partial(reduce, lambda x, f: f(x), fs)
print(compose(upper, pad, swap)("foo"))
</code></pre>