python - 如何将模块中的所有 printf 样式转换为 python 中的格式化样式?

标签 python python-3.x python-2.7 string-formatting

我正在尝试将模块从 python 版本 2.x 转换为 python 版本 3.x。为此,我使用了 2to3 转换器。然而,由于我在这个转换器中找不到任何参数也可以将 %sprintf-style 更改为 str.format() 样式我刚刚尝试使用 pyupgrade封装如下:

pyupgrade /path/to/myfile.py

不过这个也没有做任何改变。如果有转换器可以做到这一点,您有什么想法或建议吗?

例如

limit=None
ll = 23
limitQuery = 'LIMIT %s,%s'% (limit, ll)
print(limitQuery)

运行此命令后它不会改变: pyupgrade/Users/Eli/Desktop/test.py

最佳答案

该项目要么在这方面存在一些错误,要么他们故意忽略不满足最低格式要求的代码。

您的示例失败,因为 '% 字符之间没有空格:

$ echo "limitQuery = 'LIMIT %s,%s'% (limit, ll)" | pyupgrade -
limitQuery = 'LIMIT %s,%s'% (limit, ll)

添加空格时,项目会正确转换语法:

$ echo "limitQuery = 'LIMIT %s,%s' % (limit, ll)" | pyupgrade -
limitQuery = 'LIMIT {},{}'.format(limit, ll)

我已经提交了 bug report与项目。他们已经确认这是故意的:

this is one of the timid parts of pyupgrade, if your code is not well formatted to begin with it won't try to fix it for you.

希望这将在文档中明确说明。

要解决此问题,您可以运行 black code formatter先上代码;黑色将执行 PEP 8 标准并为您插入该空间:

$ echo "limitQuery = 'LIMIT %s,%s'% (limit, ll)" | black -q - | pyupgrade -
limitQuery = "LIMIT {},{}".format(limit, ll)

关于python - 如何将模块中的所有 printf 样式转换为 python 中的格式化样式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58271843/

相关文章:

django - 如何通过单击django生成的html页面上的按钮来执行python程序

python - 在 Mechanize Python 中获取 'FormNotFoundError'

python - 删除具有可互换名称值的行的重复项(Pandas、Python)

python - 图像因 cv2.warpPerspective 而失去质量

python - 如何用python从服务器下载csv文件?

python - 如何不解压查询返回的所有内容?

python - 提取维基百科中的所有城市

python - 如何使用日期作为 x 轴绘制数据框

python - 无法使用 Anaconda python 3.6.1 打开 Jupyter 笔记本

python - 在 Tkinter 中将颜色绑定(bind)到按钮会导致 TclError