Python: '{0.lower ()}'. Format ('A') дает объект 'str' без атрибута 'lower ()' - PullRequest
3 голосов
/ 31 марта 2019

В строках Python есть метод lower():

>>> dir('A')
[... 'ljust', 'lower', 'lstrip', ...]

Однако, когда кто-то пытается '{0.lower()}'.format('A'), ответ гласит:

>>> '{0.lower()}'.format('A')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute 'lower()'

Может кто-нибудь помочь мне понять, почемустрока выше бросает AttributeError в этом случае?Кажется, что это не должно быть AttributeError, хотя я должен ошибаться.Любая помощь в понимании этого будет очень кстати!

Редактировать: Я понимаю, что не могу вызвать метод lower () внутри вызова формата (хотя было бы аккуратно, если бы это было возможно);мой вопрос, почему при этом выдается ошибка AttributeError.Эта ошибка кажется вводящей в заблуждение в этом случае.

Ответы [ 2 ]

8 голосов
/ 31 марта 2019

Вы не можете вызвать метод из спецификации формата. Точечная запись внутри спецификатора формата - это способ поиска имен атрибутов и отображения их значений, а не вызова функций.

0.lower() пытается найти атрибут в строке буквально с именем "lower ()". Вам необходимо вызвать метод перед форматированием.

>>> '{0.lower()}'.format('A')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute 'lower()'
>>> '{0}'.format('A'.lower())
'a'
3 голосов
/ 31 марта 2019

Как уже говорили другие, вы не можете сделать это в выражении формата. Хотя это будет работать в виде строки:

a = "A"
print(f"{a.lower()}")
...