【发布时间】:2019-03-22 11:32:13
【问题描述】:
我有一个函数链,都在类的其他地方定义:
fus(roh(dah(inp)))
其中inp 是字典或bool(False)。
期望的结果是,如果 inp 或任何函数的计算结果为 False,则函数堆栈返回 False。
我尝试使用三元运算符,但它们的计算结果不正确。
def func(inp):
return int(inp['value']) + 1 if inp else False
如果 i == False 抛出 TypeError,bool not subscriptable,因为 inp['value'] 在条件之前被评估。
我知道我可以明确地做到这一点:
def func(inp):
if inp == False:
return False
else:
return inp['value'] + 1
但是有很多函数,这将使我的代码长度几乎增加四倍。它还一次又一次地重写完全相同的代码行,这向我表明这是错误的做事方式。
我怀疑带有参数的装饰器是答案,但我玩得越多,我就越不确定。
def validate_inp(inp):
def decorator(func):
def wrapper(*args):
return func(inp) if inp else False
return wrapper
return decorator
@validate_inp(inp)
def func(inp):
return int(inp['value']) + 1
不幸的是,装饰器调用引发了 NameError,'inp' 未定义。但是我不确定是我错误地使用了装饰器,还是装饰器是错误的解决方案。
寻找评论、批评、建议和/或健全性检查。
如果您发现这试图解决您自己的问题...
您可能希望使用空字典而不是布尔值 False。给@chepner 的道具。
在我的应用程序中,使用 False 是“可以的”,但没有任何优势,并且会导致一些代码块。
我发现使用空字典可以让一切变得更简单。我将使用 dict 的函数与一个装饰器包装起来,该装饰器捕获由引用 dict['value'] 引发的 KeyError,其中 dict 为空。
【问题讨论】:
-
你控制
inp吗?你知道空字典是假的吗? -
你能返回一个空字典而不是
False吗?至少到那时,您可以专注于编写始终适用于字典的函数。 -
@chepner 上帝,我正要评论“寻找 Maybe monad 不是吗?” :)
-
@Jefe 你确定
inp在引发异常时是False吗?尝试在函数的第一行打印inp。 -
return int(inp['value']) + 1 if inp else False应该可以工作,因为x if y else z仅在选择了表达式的那一侧时才计算x或z。你还有其他问题。
标签: python python-3.x