Синтаксис str.format()
отличается от синтаксиса f-строки. В частности, в то время как f-строки по существу позволяют вам помещать любое выражение в скобки, str.format()
значительно более ограничен. Согласно документации :
Грамматика для поля замены выглядит следующим образом:
replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"
field_name ::= arg_name ("." attribute_name | "[" element_index "]")*
arg_name ::= [identifier | digit+]
attribute_name ::= identifier
element_index ::= digit+ | index_string
index_string ::= <any source character except "]"> +
conversion ::= "r" | "s" | "a"
format_spec ::= <described in the next section>
Обратите внимание, что при именах атрибутов(через оператор точки .
) и индексы (через квадратные скобки []
) - другими словами, значения - являются действительными, фактическими вызовами методов (или любыми другими выражениями ) не. Я предполагаю, что это потому, что str.format()
на самом деле не выполняет текст, а просто заменяет объект, который уже существует.
Фактические f-строки (ваш второй пример) имеют синтаксис, аналогичный str.format()
метод, в котором они используют фигурные скобки {}
для обозначения областей, подлежащих замене, но согласно PEP, который их представил ,
F-строки обеспечиваютспособ встраивать выражения в строковые литералы, используя минимальный синтаксис. Следует отметить, что f-строка на самом деле является выражением, вычисляемым во время выполнения, а не постоянным значением.
Это явно отличается (более сложно), чем str.format()
, что является болеепростая замена текста - f-строка является выражением и выполняется как таковая, и допускает полные выражения внутри ее скобок (на самом деле, вы даже можете вкладывать f-строки друг в друга, что интересно).