python - 是否可以在python中声明用户定义的语句(与assert的语法相同)?

标签 python overriding statements user-defined

例如,断言的作用:

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 时才进行评估被违反了,即它还可能包含昂贵的函数调用或您不希望发生的副作用。

当然,虽然其他异常也可以正常工作,但任何 AssertionErrorassert 提出您的函数调用的函数中的语句也将被装饰器捕获和处理。如果这是一个问题,您可以 (a) 包装 <value>在一些特殊的包装对象中,并且只返回 _f 中的对象,否则重新加注 AssertionError ,或 (b) 将您在函数中调用的所有函数包装起来,这也可能引发 AssertionError这样他们的AssertionErrors被包裹在另一个异常中。

关于python - 是否可以在python中声明用户定义的语句(与assert的语法相同)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58957645/

相关文章:

java - 子类抛出异常的标准是什么

python - 操作数无法与形状 (16,) (21,) -pandas 一起广播

Python pandas 迭代数据框

ios - 推送后如何覆盖导航 Controller ?

javascript - 带有 Javascript 的 Volusion 中的页面特定 CSS

c - 如果语句没有被捕获

if-statement - Jinja2 if 语句中多个 if not + OR 的正确语法

css 的 Jquery 条件语句?

python - 你能给我一个在 Django 中使用基于类的 View 的 Mixins 的例子吗?有什么用处?

python - 为什么我在安装 daphne 时出现此错误?