Python 行继续导致 DeprecationWarning

Are*_*res 0 python django python-3.x

在 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)
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

但是,在启动时,这会生成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"\
Run Code Online (Sandbox Code Playgroud)

这确实不是,但是:

command = "foo {0} bar {1}"\
    .format(file_path, output_path)
Run Code Online (Sandbox Code Playgroud)

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

是什么导致了这个警告,为什么它只出现在这种非常狭窄的情况下?

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

aba*_*ert 5

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

警告明确包括\,

DeprecationWarning: invalid escape sequence \,
Run Code Online (Sandbox Code Playgroud)

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

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

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

Python 3.6 中的新增功能中提到了此更改,并附有指向问题 #27364 的链接,该链接指向之前关于 -dev 邮件列表的讨论

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

但这会导致各种混乱,特别是对于 Windows 用户(他们使用'C:\Spam','C:\spam''C:\Vikings',但使用 时出错'C:\vikings'),以及来自遵循 C 风格转义规则的大量语言中的任何一种的人(哪里\,会意味着只是一个逗号——尽管大多数 C 编译器会为此生成警告),这大概就是您现在收到警告的原因。

  • @Ares:他们可能将`DeprecationWarning` 的处理行为设置为`module`(在给定模块中首次引发时打印,然后静默)或`once`(在程序范围内第一次出现警告时打印每类警告,然后再也不会)。无论哪种方式都会得到您描述的行为。 (2认同)