Почему f-струны не играют красиво со словарями? - PullRequest
0 голосов
/ 23 ноября 2018

f-строки плохо себя ведут при использовании со словарями, как уже упоминалось здесь .

Вот пример не очень приятного поведения:

d = {'foo': 'bar'}

# Both work as expected
d["foo"]
d['foo']

# This only works when different quotations are used in the inner and outer strings
f'{d["foo"]}'
f"{d['foo']}"

# This doesn't work
f'{d['foo']}'
f"{d["foo"]}"

# The .format() method doesn't care
'{}'.format(d['foo'])

Последние две перечисленные f-строки приводят к SyntaxError: invalid syntax, что происходит потому, что строка '{d['foo']}' оценивается как '{d[' foo ']}'.

В чем основная причина, что все в фигурных скобках f-строк не оценивается отдельно, как при использовании старого метода .format(), и что может быть причиной реализации f-строк втаким образом?

Я люблю f-струны, но это похоже на точку в пользу старого метода.

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Один традиционный способ включения кавычек в кавычки - использовать обратную косую черту.Но PEP498 запрещает обратную косую черту в выражениях внутри f-строк:

Обратная косая черта может не отображаться внутри частей выражений f-строк ... Вы можете использовать другой тип кавычек внутри выражения ...

Таким образом, единственный доступ к значению словаря, заданному ключом в выражении f-строки, - это использовать кавычку другого типа.Использование одинарных или двойных кавычек везде неоднозначно и дает SyntaxError.

str.format - обычный метод, и как таковой работает по-другому: d['foo'] оценивается перед строится строка.Точно так же, как когда вы передаете аргументы функции, аргументы оцениваются до того, как функция что-либо сделает.

0 голосов
/ 23 ноября 2018

Это не имеет ничего общего с f -струнками.f строки - это общие строки после оценки.То, что вы пытаетесь, будет проблемой со стандартными строками

Проблема в том, что

'a "b" c' 

объявляет литерал a "b" c

, а

'a 'b' c'

котировки закрываются и открываются снова.Таким образом, она эквивалентна строке a, за которой следует переменная b, за которой следует строка c.

Именно поэтому Python поддерживает оба типа кавычек

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...