前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >[PYTHON] invalid escape sequence '\(' 问题处理

[PYTHON] invalid escape sequence '\(' 问题处理

原创
作者头像
大大刺猬
发布2024-12-17 13:17:41
发布2024-12-17 13:17:41
43500
代码可运行
举报
文章被收录于专栏:大大刺猬大大刺猬
运行总次数:0
代码可运行

导读

当我们执行Python代码的时候, 可能会遇到如下Warning

代码语言:txt
复制
/tmp/ibd2sql/ibd2sql-main/ibd2sql/innodb_type.py:62: DeprecationWarning: invalid escape sequence '\('

这个告警很简单, 就是说无效的转义序列, 也就是代码里面的反斜杠(\)有问题,但不得(毕竟是告警)

复现

这个报错我之前没遇到过, 因为我的环境是linux和windows, 而这个报错是在MACOS上见到的, 那我们没得macos的咋复现呢?

既然是Python的Warning, 那么python就有显示所有Warning的参数, 我们使用python --help 果然查询到了参数是 -W

那我们可以准备如下代码来复现

代码语言:python
代码运行次数:0
复制
import re
aa = re.compile('char\((.+)\)').findall('x')

然后执行的时候加上 -Wall即可

代码语言:shell
复制
python3 -Wall t20241217.py

解决办法

解决办法也很简单,

1. 可以加个 r (real) .

比如

re.compile('char\((.+)\)').findall('x') 修改为 re.compile(r'char\((.+)\)').findall('x')

2. 或者给 反斜杠再加个反斜杠

虽然这个方法不如方法1, 但也不是不行. 即re.compile('char\\((.+)\\)').findall('x')

扩展

还有个神奇的现象, 就是第一次跑有这个Warning, 什么也不做, 直接跑第二次, 就没得了.... 为了方便演示, 我们直接使用for循环演示

代码语言:shell
复制
for i in {1..2}; do python3 -Wall main.py /tmp/t1.ibd --sql --limit 1;done

我们看到 只有第一次出现了转义告警, 第二次就没了? 为啥呢?

--------------------------------- 分割线 -----------------------------------------------------------------------------

python执行代码的时候会在__pycache__目录下生成对应的pyc文件, 就是python字节码文件, 这样后面执行的时候只需要看下时间戳是否能对上, 对上的话, 就没必要再转字节码了. 而这个warning是转字节码的时候告警的, 而不是执行阶段告警的.

直接执行的话, 不会生成pyc字节码, 因为Python会认为你只是偶尔执行, 没必要保存. 我们使用import即可.(都调包了,python就给我们把字节码保存起来了)

而我们直接执行pyc代码, 也没有相关告警, 就证明这个告警只是在生成字节码的阶段才会有.

总结

python执行的时候先转换为字节码, 转换的时候会有一些告警,尤其是正则表达式出现转义时, 我们可以使用real模式(r'str')来处理这个问题. 通常只有macos才有, linux和win通常不会有对应的告警, 要模拟的话, 可以加个 -Wall 来模拟.

由于是在转字节码阶段产生的告警, 所以通常只有文件被修改(时间戳变化)时才能遇到.

啊, 又水了一篇.

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 导读
  • 复现
  • 解决办法
    • 1. 可以加个 r (real) .
    • 2. 或者给 反斜杠再加个反斜杠
  • 扩展
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档