Python 3.12 语法警告:三引号字符串上的转义序列无效,`\d` 必须是 `\d`

问题描述 投票:0回答:2

更新到 Python 3.12 后,我收到以下警告 某些三引号注释上的转义序列无效。

这是新的限制吗?我习惯使用三引号字符串来记录代码,但这在 Python 3.12 之前从来都不是问题。

python3 --version
Python 3.12.0
$ ./some_script.py
/some_script.py:123: SyntaxWarning: invalid escape sequence '\d'
  """

我尝试用

\d
替换所有行:

20230808122708.445|INFO|C:\dist\work\trk-fullstack-test\namespaces.py

\\d
:

20230808122708.445|INFO|C:\\dist\work\trk-fullstack-test\namespaces.py

警告消失。

抑制警告似乎不起作用:

import warnings
warnings.filterwarnings('ignore', category=SyntaxWarning)

有关于如何正确执行此操作的任何指示吗?我希望我不必转义代码中三引号中记录的所有 Windows 路径。

python warnings string-literals quoting python-3.12
2个回答
28
投票

回到 Python 3.6,在字符串文字中使用无效转义序列已弃用 (bpo-27364)。从那时起,尝试使用无效的转义序列就会发出

DeprecationWarning
。如果您没有在启用“警告”的情况下运行 Python,这一点通常会被忽视。 DeprecationWarnings 默认静音。
Python 3.12 

DeprecationWarning 升级为

SyntaxWarning
SyntaxWarning是编译器在解析代码时发出的,而不是在运行代码时发出的,因此不能使用运行时警告过滤器来忽略它们。与
DeprecationWarnings
不同,
SyntaxWarnings
默认显示,这就是您现在看到它的原因。这种可见度的增加是有意为之的。在 Python 的未来版本中,计划在字符串文字中使用无效的转义序列最终会成为一个难题
SyntaxError
最简单的解决方案是使用 

# comments

 作为注释而不是字符串文字。与字符串文字不同,注释不需要遵循任何特殊的语法规则。另请参阅 
Python 注释:# 与字符串 中的讨论,了解有关使用字符串文字作为注释的缺点的更多信息。 要解决此警告,您可以将字符串文字设置为

原始字符串文字

r"..."。原始字符串文字不处理转义序列。例如,字符串

"\n"
包含单个换行符,而字符串
r"\n"
包含两个字符
\
n
    


10
投票

3.11.4中 之前:

'(?:\d{4}(-)?\d{3}(-)?[8]\d{2}(-)?\d{2})'

3.12.3中
之后:

r'(?:\d{4}(-)?\d{3}(-)?[8]\d{2}(-)?\d{2})'

    

© www.soinside.com 2019 - 2024. All rights reserved.