有没有一种工具可以自动将字符串格式类型转换为f-strings?

36
自Python 3.6以来,将值格式化为字符串的最短且性能最佳的方法是PEP 498 f-strings(例如:f'Hello {name}')。
将旧的格式化类型('Hello %s' % name'Hello {}'.format(name))转换为现有代码库中的新类型似乎是可以自动完成的任务,但我找不到任何可以实现此操作的工具。是否有工具可以自动将使用旧字符串格式的文字转换为f-strings?

1
你确定要这样做吗?因为如果你想与其他人分享你的代码,而他们的Python版本低于3.6,那么它对他们来说将无法工作。 - Nakor
@Nakor 在我们公司中,Python 3.5已经被弃用,而我们并没有太多使用Python 2(也将在6个月后停止支持)。但你是对的,这很重要记住! - mari.mts
2个回答

47

你可以使用flynt将多个Python文件转换为f-strings格式。

要运行它,您需要一个Python 3.6+解释器。然后,只需执行以下操作:

pip install flynt
flynt [relative or absolute path to the root of your project]

请记住,这将直接更改文件,因此建议将其提交到您偏好的git或SVC系统中。

这里有一篇文章介绍了使用f-strings的优点和缺点:

https://medium.com/@ikamen/f-strings-make-your-python-code-faster-and-more-readable-today-579ef9ca0313

免责声明:我是flynt软件包的作者。


1
当我不得不编辑别人的糟糕代码时,我几乎要哭了。他们主要使用了字符串拼接,所以我不得不使用 flynt --transform-concats。它只花费了0.5秒,字符计数减少了 "68198 (99.70%)"! - MrTomRod

8

看起来pyupgrade能够将%格式转换为format函数,也能将format函数转换为f-strings。

printf-style string formatting

Availability:

Unless --keep-percent-format is passed.

'%s %s' % (a, b)                  # '{} {}'.format(a, b)
'%r %2f' % (a, b)                 # '{!r} {:2f}'.format(a, b)
'%(a)s %(b)s' % {'a': 1, 'b': 2}  # '{a} {b}'.format(a=1, b=2)

f-strings

Availability:

--py36-plus is passed on the commandline.

'{foo} {bar}'.format(foo=foo, bar=bar)  # f'{foo} {bar}'
'{} {}'.format(foo, bar)                # f'{foo} {bar}'
'{} {}'.format(foo.bar, baz.womp}       # f'{foo.bar} {baz.womp}'
注意:pyupgrade故意谨慎,如果将f-string与表达式长度相等或者替换参数不是简单名称或点分名称(因为这可能会降低可读性),则不会创建它。

1
有没有一种方法可以在目录上递归调用它?找不到相关的说明。 - mari.mts
1
@mari.mts 不是针对库本身的,但你可以随时运行 find . -name '*.py' -exec pyupgrade {} \; - Francisco
1
还有 pyupgrade **/*.py - Hugo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接