抽象
此 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-通用许可证,以更宽松的许可证为准。
文章声明:以上内容(如有图片或视频在内)除非注明,否则均为腾龙猫勺儿原创文章,转载或复制请以超链接形式并注明出处。
本文作者:猫勺本文链接:https://www.jo6.cn/post/63.html
还没有评论,来说两句吧...