这应该在 Python 3.4 中工作:
>>> a='tttt'
>>> print(f'The value of a is {a}')
这应该在 Python 3.4 中工作:
>>> a='tttt'
>>> print(f'The value of a is {a}')
我写了一个(可怕的)东西,通过编码技巧使它们成为可能:
第一的:
pip install future-fstrings
然后替换编码cookie(如果有的话)和bam!python中的f字符串<3.6
# -*- coding: future_fstrings -*-
thing = 'world'
print(f'hello {thing}')
运行:
$ python2.7 main.py
hello world
不,f
字符串是在 Python 3.6 中引入的,目前(截至 2016 年 8 月)处于 alpha 阶段。
如果真的需要,您至少可以效仿它们
def f(string):
# (!) Using globals is bad bad bad
return string.format(**globals())
# Use as follows:
ans = 'SPAM'
print(f('we love {ans}'))
或者可能是其他一些方式,比如__getitem__
如果你喜欢 f[...] 语法,可以重新加载一个类
我刚刚为f-string编写了一个反向端口编译器,称为f2format
. 您可以使用Python 3.6风格编写f 字符串文字,并编译为兼容版本供最终用户运行,就像JavaScript 一样。Babel
f2format
应使用方法替换f 字符串文字str.format
,同时保持源代码的原始布局。你可以简单地使用
f2format /path/to/the/file_or_directory
这将重写所有 Python 文件。例如,
# original source code
var = f'foo{(1+2)*3:>5}bar{"a", "b"!r}boo'
# after f2format
var = ('foo{:>5}bar{!r}boo').format(((1+2)*3), ("a", "b"))
字符串连接、转换、格式规范、多行和 unicode 都被正确处理。有关更多信息,请查看自述文件。
是的,如果您安装和使用 future-fstrings 模块,可以在低于 3.7 的 Python 3.x 中使用 f-strings,但有一些重要的细微差别。
“# -*- coding: future_fstrings -*-”行必须是脚本的第一行。
井号 # 很重要,否则此语法将不起作用。
future-fstrings 和 tokenize_rt 模块的版本必须合适,否则会收到奇怪的错误消息。我将在此处发布有关此问题的更多详细信息,因为我看到很多人在谷歌上搜索这些错误消息。
简单的脚本:
test_fstrings_A.py:
import test_fstrings_B
test_fstrings_B.py:
# -*- coding: future_fstrings -*-
thing = 'world'
print(f'hello {thing}')
输出:
$ python3 test_fstrings_B.py
File "test_fstrings_B.py", line 1
SyntaxError: encoding problem: future_fstrings
$ python3 test_fstrings_A.py
Traceback (most recent call last):
File "test_fstrings_A.py", line 2, in <module>
import test_fstrings_B
File "/home/build01/test_fstrings_B.py", line 0
SyntaxError: invalid syntax (tokenize_rt.py, line 22)
我遇到了这个麻烦,因为我的系统上提到的模块版本错误:
$ cd $HOME/.local/lib/python3.5/site-packages; ls -d *.dist-info; cd -
future_fstrings-1.2.0.dist-info pip-20.3.1.dist-info tokenize_rt-4.0.0.dist-info
为了检查版本是否正确,可以首先将模块安装在本地目录中作为 . whl并以这种方式测试它,因为我从这个问题中学到了https://bugs.python.org/issue33944#msg333705
$ python3 -m pip download -d pkgs future_fstrings
...
Saved ./pkgs/tokenize_rt-3.2.0-py2.py3-none-any.whl
Saved ./pkgs/future_fstrings-1.2.0-py2.py3-none-any.whl
Successfully downloaded tokenize-rt future-fstrings
$ PYTHONPATH=./pkgs/future_fstrings-1.2.0-py2.py3-none-any.whl:./pkgs/tokenize_rt-3.2.0-py2.py3-none-any.whl python3 test_fstrings_A.py
hello world
$ PYTHONPATH=./pkgs/future_fstrings-1.2.0-py2.py3-none-any.whl:./pkgs/tokenize_rt-3.2.0-py2.py3-none-any.whl python3 test_fstrings_B.py
hello world
换句话说,命令“python3 -m pip download”安装并输出正确(适用于已安装的 Python 版本)版本的模块。这帮助我看到我的 Python 安装位置中的 tokenize_rt-4.0.0 版本是错误的。
最后一步是全局修复它,使用 pip3 的 --force-reinstall 参数:
$ pip3 install --force-reinstall pkgs/future_fstrings-1.2.0-py2.py3-none-any.whl
or
$ python3 -m pip install --force-reinstall future_fstrings
更新:在某些情况下,命令“python3 -m pip download”无论如何都会安装错误的 tokenize_rt 4.0.0 版本。在这种情况下,只有明确的版本规范有帮助:
$ python3 -m pip install --force-reinstall future_fstrings==1.2.0 tokenize_rt==3.2.0