是否可以在 python 中声明用户定义的语句(与断言相同的语法)?
Is it possible to declare user-defined statements in python (same syntax of assert)?
例如,断言的作用:
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>
但简明扼要,只有一行。我知道我应该只用最后一个,但我更想知道你能用多少 override/customize python.
如果您正在寻找单表达式 if
语句(而不是如果为假则导致失败的断言),那么请执行以下操作:
<value> if <boolean assertion to check> else <another value>
如果您没有 <another value>
的任何东西,让它成为 None
是 Pythonic。
x = 3 if 10<5 else None
给 x
值 None
.
x = 3 if 10>5 else None
给 x
值 3
。
你不能使用任何 "user-defined" 语法,但你可以只使用 assert
本身并使用装饰器使函数 return 成为值而不是引发 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>
行的意思就是 "check whether <condition>
holds, otherwise immediately return <value>
",也就是说,几乎就是您想要的。如果 <value>
被省略,函数将只是 return None
在这种情况下,如装饰器中定义的那样。另请注意 <value>
仅在违反 assert
时才进行评估,即它还可能包含昂贵的函数调用或您不希望在其他情况下发生的副作用。
当然,虽然其他异常也能正常工作,但您的函数正在调用的函数中由 assert
语句引发的任何 AssertionError
都将 也 被捕获并由装饰者处理。如果这是一个问题,您可以 (a) 将 <value>
包装在一些特殊的包装器对象中,并且只将 return 包装在 _f
中,否则重新引发 AssertionError
,或 (b) 将您调用的所有函数包装在您的函数中,这些函数也可能引发 AssertionError
,以便它们的 AssertionErrors
包装在另一个异常中。
例如,断言的作用:
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>
但简明扼要,只有一行。我知道我应该只用最后一个,但我更想知道你能用多少 override/customize python.
如果您正在寻找单表达式 if
语句(而不是如果为假则导致失败的断言),那么请执行以下操作:
<value> if <boolean assertion to check> else <another value>
如果您没有 <another value>
的任何东西,让它成为 None
是 Pythonic。
x = 3 if 10<5 else None
给 x
值 None
.
x = 3 if 10>5 else None
给 x
值 3
。
你不能使用任何 "user-defined" 语法,但你可以只使用 assert
本身并使用装饰器使函数 return 成为值而不是引发 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>
行的意思就是 "check whether <condition>
holds, otherwise immediately return <value>
",也就是说,几乎就是您想要的。如果 <value>
被省略,函数将只是 return None
在这种情况下,如装饰器中定义的那样。另请注意 <value>
仅在违反 assert
时才进行评估,即它还可能包含昂贵的函数调用或您不希望在其他情况下发生的副作用。
当然,虽然其他异常也能正常工作,但您的函数正在调用的函数中由 assert
语句引发的任何 AssertionError
都将 也 被捕获并由装饰者处理。如果这是一个问题,您可以 (a) 将 <value>
包装在一些特殊的包装器对象中,并且只将 return 包装在 _f
中,否则重新引发 AssertionError
,或 (b) 将您调用的所有函数包装在您的函数中,这些函数也可能引发 AssertionError
,以便它们的 AssertionErrors
包装在另一个异常中。