AttributeError: у объекта 'str' нет атрибута 'title ()' - PullRequest
1 голос
/ 12 ноября 2019
first="harry"
last="potter"

print(first, first.title())
print(f"Full name: {first.title()} {last.title()}")
print("Full name: {0.title()} {1.title()}".format(first, last))

Первые два утверждения работают нормально;Это означает, что есть атрибут title () для объекта 'str'. Третий оператор печати выдает ошибку. Почему это так?

Ответы [ 2 ]

0 голосов
/ 12 ноября 2019

str.format () передает строковый объект в соответствующий заполнитель. А используя '. ', вы можете получить доступ к строковым атрибутам или функциям. Вот почему {0.title ()} ищет конкретный метод в строковом классе и ничего не получает о title () .

Но если вы используете

print("Full name: {0.title} {1.title}".format(first, last))

>> Full name: <built-in method title of str object at 0x7f5e42d09630><built-in method title of str object at 0x7f5e42d096b0>

Здесь вы можете увидеть доступ к встроенному методу строки

Если вы хотите использовать title () с format () , затем используйте так:

print("Full name: {0} {1}".format(first.title(), last.title()))

>> Full name: Harry Potter
0 голосов
/ 12 ноября 2019

Синтаксис 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-строки друг в друга, что интересно).

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