例如,断言的作用:
assert <boolean assertion to check>, <error string/value outputted if that assertion False>
我想做的事:
mycommand <boolean assertion to check>, <value that will get returned if assertion is False>
这与执行以下操作相同:
if not <boolean assertion to check>: return <value>
但简洁,只有一句简单的话。我知道我应该只使用最后一个,但我更感兴趣的是找出你可以重写/自定义 python 的程度。
最佳答案
您不能使用任何“用户定义”语法,但您可以只使用 assert
本身并使用装饰器使函数返回值而不是引发 AssertionError
:
def assert_to_return(f):
def _f(*args, **kwargs):
try:
return f(*args, **kwargs)
except AssertionError as e:
return e.args[0] if e.args else None
return _f
@assert_to_return
def div(x, y):
assert y != 0, float("nan")
return x / y
print(div(42, 5)) # 8.4
print(div(42, 0)) # nan
这样,assert <condition>, <value>
该行的意思是“检查<condition>
是否成立,否则立即返回<value>
”,即几乎正是您想要的。如果<value>
省略,该函数将仅返回 None
在这种情况下,如装饰器中所定义。另请注意 <value>
仅当 assert
时才进行评估被违反了,即它还可能包含昂贵的函数调用或您不希望发生的副作用。
当然,虽然其他异常也可以正常工作,但任何 AssertionError
由 assert
提出您的函数调用的函数中的语句也将被装饰器捕获和处理。如果这是一个问题,您可以 (a) 包装 <value>
在一些特殊的包装对象中,并且只返回 _f
中的对象,否则重新加注 AssertionError
,或 (b) 将您在函数中调用的所有函数包装起来,这也可能引发 AssertionError
这样他们的AssertionErrors
被包裹在另一个异常中。
关于python - 是否可以在python中声明用户定义的语句(与assert的语法相同)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58957645/