Должны ли f-строки работать в Python 3.4?
Это должно работать в Python 3.4:
>>> a='tttt'
>>> print(f'The value of a is {a}')
5 ответов
Вы могли бы по крайней мере подражать им, если действительно нужно
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[...] синтаксис
Я написал (ужасную) вещь, которая позволяет им с помощью трюка кодирования:
Первый:
pip install future-fstrings
а затем замените кодировочный файл cookie (если он у вас есть) и bam! f-струны в питоне<3.6
# -*- coding: future_fstrings -*-
thing = 'world'
print(f'hello {thing}')
Runtime:
$ python2.7 main.py
hello world
Нет, f
Строки были введены в Python 3.6, который в настоящее время (по состоянию на август 2016 года) находится в альфа-версии.
Я только что написал бэк-порт компилятора для f-строки, под названием f2format
, Вы можете писать литералы f-строки в Python 3.6 и компилировать в совместимую версию для запуска конечными пользователями, как Babel
для JavaScript.
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"))
Конкатенация строк, преобразование, спецификация формата, многострочные и unicodes все обрабатываются правильно. Для получения дополнительной информации просто проверьте README.
Да, можно использовать f-строки с Python 3.x ниже, чем 3.7, если вы установите и используете модуль future-fstrings, но есть важные нюансы.
Строка «# -*- 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) версии модулей. Это помогло мне увидеть, что версия tokenize_rt-4.0.0 неверна в моем месте установки Python.
Заключительным шагом было исправить это глобально, используя параметр --force-переустановить для pip3:
$ 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» все равно устанавливает неправильную версию 4.0.0 tokenize_rt. В этом случае помогло только явное указание версии:
$ python3 -m pip install --force-reinstall future_fstrings==1.2.0 tokenize_rt==3.2.0