PEP 679 – 允许在断言语句中使用括号

猫勺猫勺 03-15 165 阅读 0 评论

抽象

PEP 建议允许将 assert 语句。这将导致解释器重新解释之前的内容 本来是一个具有始终为 True 的双元素元组的断言 () 到带有主语和 失败消息,等效于删除了括号的语句 ().assert (expression, message)assert expression, message

赋予动机

使用包含 assert 语句的格式时,这是一个常见的用户错误 用括号括起来的错误消息。不幸的是,这个错误 传递未检测到,因为断言将始终传递,因为它是 解释为 assert 语句,其中表达式是一个双元组,其中 始终具有 Truth-y 值。

当将测试或描述扩展到 单行,因为括号是这样做的自然方法。

这很常见,以至于现在由编译器发出 a。SyntaxWarning

此外,该语言中的其他一些语句允许使用括号形式 以一种或另一种方式,如语句 () 和语句 ()。importfrom x import (a,b,c)deldel (a,b,c)

允许括号不仅可以消除常见错误,还可以允许 用户和自动格式化程序,用于在多行上设置长断言语句的格式 本文档的作者认为这将是一种更自然的方式。 虽然目前可以格式化长语句 多行为:assert

assert (
    very very long
    expression), (
    "very very long "
    "message")

本文档的作者认为括号中的形式更清晰,更符合 其他语法结构的格式:

assert (
    very very long
    expression,

    "very very long "
    "message",)

此更改最初已在 [bpo-46167] 中讨论和提出。

理由

此更改可以在分析器或编译器中实现。我们有 选择在解析器中实现此更改,因为在编译器中执行此更改 将需要使用两个元组重新解释断言语句的 AST:

Module(
    body=[
        Assert(
            test=Tuple(
                elts=[
                    Name(id='x', ctx=Load()),
                    Name(id='y', ctx=Load())],
                ctx=Load()))],
    type_ignores=[])

作为带有表达式和消息的断言语句的 AST:

Module(
    body=[
        Assert(
            test=Name(id='x', ctx=Load()),
            msg=Name(id='y', ctx=Load()))],
    type_ignores=[])

这种方法的问题在于,第一种形式的 AST 将 从技术上讲是“不正确的”,因为我们已经有一个专门的 AST 表格 带有测试和消息的断言语句(第二个)。这 这意味着许多处理 AST 的工具都需要了解这一变化 在语义中,这会令人困惑,因为已经有一个正确的形式 更好地表达了新的含义。

规范

此 PEP 建议将语句的语法更改为:assert

'assert' '(' expression ',' expression [','] ')' &(NEWLINE | ';')| 'assert' a=expression [',' expression ]

其中第一行是 assert 语句的新形式,允许 括弧。需要 lookahead,以便仍然正确解析这样的语句,并防止解析器急切地 捕获元组作为完整语句。assert (a, b) <= c, "something"

(可选)可以添加新的“无效”规则以生成自定义语法错误 覆盖包含 0、1、3 或更多元素的元组。

向后兼容

从技术上讲,此更改不向后兼容,因为解析目前被解释为以 2 元组为主题的断言语句, 而在此更改之后,它将被解释为 .assert (x,y)assert x,y

另一方面,这种断言语句总是通过的,所以它们是 实际上,在用户代码中不做任何事情。本文档的作者认为 这种向后不相容的性质是有益的,因为它将强调 这些情况在用户代码之前不会被注意到(假设 这些情况仍然存在,因为用户忽略了语法警告)。

安全隐患

此更改不会带来任何安全隐患。

如何教这个

声明的新形式将作为语言的一部分记录下来 标准。assert

当向用户教授带有语句错误消息的表单时, 现在可以注意到,添加括号也按预期工作,这允许中断 多行语句。assert

参考实现

[GH-30247] 中存在带有更改的拟议 PR 草案。

版权

本文档被置于公共领域或位于 CC0-1.0-通用许可证,以更宽松的许可证为准。


The End 微信扫一扫

文章声明:以上内容(如有图片或视频在内)除非注明,否则均为腾龙猫勺儿原创文章,转载或复制请以超链接形式并注明出处。

本文作者:猫勺本文链接:https://www.jo6.cn/post/63.html

上一篇 下一篇

相关阅读

发表评论

访客 访客
快捷回复: 表情:
评论列表 (暂无评论,165人围观)

还没有评论,来说两句吧...

取消
微信二维码
微信二维码
支付宝二维码