Должны ли 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, но есть важные нюансы.

  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) версии модулей. Это помогло мне увидеть, что версия 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
Другие вопросы по тегам