2016-12-19 4 views
27

Благодаря David Beazley's tweet, я недавно узнал, что новый Python 3.6 f-strings также могут быть вложенными:Вложенные диафрагменные строки

>>> price = 478.23 
>>> f"{f'${price:0.2f}':*>20s}" 
'*************$478.23' 

Или:

>>> x = 42 
>>> f'''-{f"""*{f"+{f'.{x}.'}+"}*"""}-''' 
'-*+.42.+*-' 

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

Примечание: сам PEP не упоминает вложенные f-строки, но есть specific test case.

+2

Вероятно, для той же самой цели, как гнездящихся старшее 'str.format ': http://stackoverflow.com/questions/40245650/python-fixed-width-string-format-using-vars-or-dict – TigerhawkT3

+1

Еще один хороший [здесь] (http://stackoverflow.com/questions/32039239/питон-строка форматирования старый-против-новой-ул-формате). Я оставлю решение о том, нужно ли вам отмахиваться. – TigerhawkT3

+1

@ TigerhawkT3 спасибо за хорошие примеры! Я не уверен, что это прямые дубликаты, но определенно релевантные - в отношении закрытия. Я принимаю все, что решит сообщество. Я также надеюсь, что здесь может быть что-то конкретное для f-строк. Вероятно, мы должны дать тему времени и шанса. – alecxe

ответ

21

I не думаю, что форматированные строковые литералы, разрешающие вложенность (путем гнездования, я полагаю, что это означает f'{f".."}') является результатом тщательного рассмотрения возможных вариантов использования, я больше убежден, что это просто разрешено, чтобы они соответствовали их спецификации.

В спецификации указано, что они support full Python expressions внутри скобок. Также указано, что форматированный строковый литерал - это просто выражение, которое оценивается во время выполнения (см. here и here). В результате, имеет смысл только разрешить форматированный строковый литерал как выражение внутри другого форматированного строкового литерала, запрещающее его, что отрицает полную поддержку выражений Python.

Тот факт, что вы не можете найти варианты использования, упомянутые в документах (и только найти тестовые примеры в наборе тестов), заключается в том, что это, вероятно, хороший (побочный) эффект реализации, а не мотивационный прецедент ,

+1

Я боюсь, что вы правы, полностью согласитесь. Из опросов на сегодня - вернется завтра. Благодарю. – alecxe

+0

@alecxe Я почти уверен, что некоторые странные вещи, связанные с n-строкой 'f-string', в какой-то момент будут всплывать в дикой природе :-) –

-3

Вы можете использовать его для динамизма. Например, у вас есть набор переменных с именем некоторой функции:

func = 'my_func' 

Тогда вы могли бы написать:

f"{f'{func}'()}" 

, который будет эквивалентно:

'{}'.format(locals()[func]()) 

или, эквивалентным образом:

'{}'.format(my_func()) 
+0

Я попробовал, и это не сработало. 'TypeError: объект 'str' не является вызываемым' – wim

4

Я предполагаю, что это передать параметры форматирования в одной строке и, таким образом, упростить f-strings.

Например:

>>> import decimal 
>>> width = 10 
>>> precision = 4 
>>> value = decimal.Decimal("12.34567") 
>>> f"result: {value:{width}.{precision}}" 
'result:  12.35' 

Конечно, это позволяет программистам писать абсолютно нечитаемый код, но это не цель :)

+1

Да! 'str.format' всегда поддерживал это, например,' '{0:. {1} f} '. format (math.pi, 4)' is '' 3.1416''. Если f-string не может поддержать это, ну, это будет хромой. – wim

Смежные вопросы