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()
标题几乎说明了问题。我不知道是否有实用的解决方案,或者我是否对代码的行为过于挑剔。 这篇文章暗示了正确的方向,但我从来没有得到任何代码来工作。 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()