首页 > 解决方案 > Python 行继续导致 DeprecationWarning

问题描述

在 Python 3.6.5 中,这可以正常工作:

command = "ffmpeg -i {0} -vsync 0 -q:v 2 -vf select=\"eq(pict_type\,PICT_TYPE_I)\" -r 30 {1}/frame%03d.jpg".format(file_path, output_path)

这显然是一条长线,所以我使用了续行:

command = "ffmpeg -i {0} -vsync 0 -q:v 2 -vf select=\"eq(pict_type\,PICT_TYPE_I)\" -r 30 {1}/frame%03d.jpg"\
    .format(file_path, output_path)

但是,在启动时,这会生成DeprecationWarning

 DeprecationWarning: invalid escape sequence \,
  command = "ffmpeg -i {0} -vsync 0 -q:v 2 -vf select=\"eq(pict_type\,PICT_TYPE_I)\" -r 30 {1}/frame%03d.jpg"\

但是,这不是

command = "foo {0} bar {1}"\
    .format(file_path, output_path)

我在项目的其余部分都使用续行;没有一个导致DeprecationWarning像这样的其他问题提到了这个警告,但没有关于我能找到的延续字符的问题。

是什么导致了这个警告,为什么它只出现在这个非常狭窄的案例中?

编辑:这与续行无关。仅在某些时候向我显示错误的原因与 Django 的runserver. 第一次runserver运行,没有报错。但是如果更改导致重新加载,则在重新加载器运行时会报告错误。

标签: pythondjangopython-3.x

解决方案


这与您的行继续无关,它与\,在您的字符串中用作转义序列有关。

警告明确包括\,

DeprecationWarning: invalid escape sequence \,

这就是您后面的示例没有警告的原因:因为字符串中没有\,或其他无法识别的转义序列。

如字符串和字节文字的文档中所述:

在 3.6 版更改: 无法识别的转义序列产生DeprecationWarning. 在 Python 的某些未来版本中,它们将是SyntaxError.

Python 3.6中的新增功能中提到了此更改,并带有指向问题 #27364的链接,该链接指向-dev 邮件列表上的早期讨论

传统上,Python 允许在字符串文字中出现无法识别的转义序列,并且只是将它们当作不是转义符来处理,因此\,字面意思是反斜杠和逗号,因为这样可以在调试器中打印出字符串时更容易看到出了什么问题.

但这会导致各种混乱,尤其是对于 Windows 用户(他们使用'C:\Spam''C:\spam'和表示只是一个逗号——尽管大多数 C 编译器会为此生成一个警告),这大概就是你现在得到一个警告的原因。'C:\Vikings''C:\vikings'\,


推荐阅读