函数链接在Python中,如果一个段返回False,则忽略链的其余部分

2024-10-02 00:28:42 发布

您现在位置:Python中文网/ 问答频道 /正文

这个标题很好地解释了这个问题。我不知道是否有一个切实可行的解决方案,或者我是否对代码的行为过于挑剔。 这篇文章是在暗示正确的方向,但我从来没有得到任何代码工作。 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

Tags: 代码selfaddfalse标题returndefcalc
2条回答

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

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

我认为这篇文章的意思或多或少与下面类似(但我更喜欢使用exception的另一个答案,因为它更可读,更易于测试)。 创建帮助器类:

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()

相关问题 更多 >

    热门问题