Python 中的函数链接,如果段 returns False,则忽略链的其余部分

Function Chaining in Python, ignore rest of chain if a segment returns False

标题几乎说明了问题。我不知道是否有实用的解决方案,或者我是否对代码的行为过于挑剔。 这篇文章暗示了正确的方向,但我从来没有得到任何代码来工作。 https://medium.com/@adamshort/python-gems-5-silent-function-chaining-a6501b3ef07e

这是我想要的功能示例:

class Calc:
    def __init__(self, n=0):
        self.n = n

    def add(self, n):
        self.n += n
        return self

    def might_return_false(self):
        return False

    def print(self):
        print(self.n)
        return self


w = Calc()

# The rest of the chain after might_return_false should be ignored
addedTwice = w.add(5).might_return_false().add(5).print()

w.print() # Should print 5

print(addedTwice) # Should print False

异常是中断链式操作的好方法:

class CalcError(Exception):
    pass


class Calc:
    def __init__(self, n: int = 0):
        self.n = n

    def add(self, n: int) -> 'Calc':
        self.n += n
        return self

    def might_raise(self) -> 'Calc':
        raise CalcError

    def __str__(self) -> str:
        return str(self.n)


w = Calc()

try:
    w.add(5).might_raise().add(5)
    addedTwice = True
except CalcError:
    addedTwice = False

print(w)           # prints 5
print(addedTwice)  # prints False

你也可以像这样做链:

w = Calc()
num_added = 0
try:
    w.add(5)
    num_added += 1
    w.add(5)
    num_added += 1
    w.might_raise()
    w.add(5)
    num_added += 1
    w.add(5)
    num_added += 1
except CalcError:
    print(f"Stopped after {num_added} additions")

如果您尝试使用 return 而不是 raise 来执行此操作,您需要检查链中每一步的状态,以便您可以切换到其他代码分支 (可能是通过 if 块)。引发异常有非常有用的 属性 立即中断执行,无论你在哪里,并直接带你到最近的匹配 except.

我认为这篇文章的意思或多或少类似于以下内容(但我更喜欢使用异常的其他答案,因为它更具可读性和更好的可测试性)。 创建助手 class:

class Empty:
    def __call__(self, *args, **kwargs):
        return self
    def __getattr__(self, *args, **kwargs):
        return self
    def print(self, *args, **kwargs):
        return False

def might_return_false(self):
    return Empty()