6

这应该在 Python 3.4 中工作:

>>> a='tttt'

>>> print(f'The value of a is {a}')

4

5 回答 5

13

我写了一个(可怕的)东西,通过编码技巧使它们成为可能:

第一的:

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
于 2017-09-14T18:22:11.020 回答
8

不,f字符串是在 Python 3.6 中引入的,目前(截至 2016 年 8 月)处于 alpha 阶段。

于 2016-08-10T06:01:46.257 回答
3

如果真的需要,您至少可以效仿它们

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[...] 语法,可以重新加载一个类

于 2016-08-10T07:23:29.550 回答
3

我刚刚为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 都被正确处理。有关更多信息,请查看自述文件

于 2018-09-17T07:25:26.797 回答
-1

是的,如果您安装和使用 future-fstrings 模块,可以在低于 3.7 的 Python 3.x 中使用 f-strings,但有一些重要的细微差别。

  1. “# -*- coding: future_fstrings -*-”行必须是脚本的第一行。

  2. 井号 # 很重要,否则此语法将不起作用。

  3. 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
于 2020-12-08T13:47:07.463 回答