str.format (список) с отрицательным индексом не работает в Python

Проблема состоит в том, что необходимо дать #inner набор width (что-либо кроме auto или inherit). margin: 0 auto; прием только работает, если внутренний элемент является более узким, чем его контейнерный элемент. Не будучи данным width, #inner автоматически расширяется до полной ширины #outer, который заставляет ее содержание быть выравниванием по левой границе.

9
задан Explogit 25 October 2009 в 07:16
поделиться

3 ответа

Это то, что я бы назвал ошибкой дизайна в спецификациях строки формата. Согласно документам ,

element_index     ::=  integer | index_string

, но, увы, -1 не является «целым числом» - это выражение. Оператор унарного минуса даже не имеет особо высокого приоритета, так что, например, print (-2 ** 2) испускает -4 - еще одна распространенная проблема и, возможно, дизайн сбой (оператор ** имеет более высокий приоритет, поэтому сначала происходит увеличение в степень, а затем изменение знака, запрошенное унарной системой с более низким приоритетом - ).

Что угодно в этой позиции в строке формата, которая не является целым числом (а, например, выражение), обрабатывается как строка для индексации аргумента dict - например:

$ python3 -c "print('The last:{0[2+2]}'.format({'2+2': 23}))"
The last:23

Не уверен, стоит ли поднимать проблему в Python trac, но это '

13
ответ дан 4 December 2019 в 13:48
поделиться

Верно, не работает. решение:

>>> 'The last:{0}'.format(a[-1])
'The last:3'
1
ответ дан 4 December 2019 в 13:48
поделиться

Как только вы начнете копать, здесь возникает несколько проблем:

Рассматриваемый элемент называется "element_index", который определяется как целое число.

Проблема 1: если только не пользователи перейдите по ссылке «целое число» на справочное руководство по языку, они не узнают, что -1 считается выражением, а не целым числом. Между прочим, любой, кто хочет сказать «работает, как задокументировано», должен сначала увидеть проплем 7: -)

Предпочтительное решение: измените определение так, чтобы «element_index» мог иметь необязательный «-» перед целым числом.

Это целое число, верно? Не так быстро ... позже в документации будет сказано, что «выражение формы '[index]' выполняет поиск по индексу с использованием __ getitem __ () »

Проблема 3: должно быть сказано '[element_index]' (индекс не определен).

Проблема 4: Не все до мозга костей знают, что делает __ getitem __ () . Нужны более ясные документы.

Итак, мы можем использовать здесь словарный запас, а также целое число, не так ли? Да, есть две проблемы:

element_index является целым числом? Да, это работает с dict:

>>> "{0[2]}".format({2: 'int2'})
'int2'

Похоже, мы также можем использовать нецелочисленные строки, но для этого нужна более подробная документация (Проблема 5):

>>> "{0[foo]}".format({'foo': 'bar'})
'bar'

Но мы не можем использовать dict с ключом вроде ' 2 '(Проблема 6):

>>> "{0[2]}".format({'2': 'str2'})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 2
>>> "{0['2']}".format({'2': 'str2'})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: "'2'"

Проблема 7: Это "целое число" действительно должно быть задокументировано как "десятичное число" ... 0x22 и 0b11 обрабатываются как str, а 010 ("восьмеричное число") обрабатывается как 10, не 8:

>>> "{0[010]}".format('0123456789abcdef')
'a'

Обновление: PEP 3101 рассказывает правду:

Значит, мы можем использовать здесь как словарный запас, так и целое число, не так ли? Да, с одной-двумя проблемами:

element_index является целым числом? Да, это работает с dict:

>>> "{0[2]}".format({2: 'int2'})
'int2'

Похоже, мы также можем использовать нецелочисленные строки, но для этого нужна более подробная документация (Проблема 5):

>>> "{0[foo]}".format({'foo': 'bar'})
'bar'

Но мы не можем использовать dict с ключом вроде ' 2 '(Проблема 6):

>>> "{0[2]}".format({'2': 'str2'})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 2
>>> "{0['2']}".format({'2': 'str2'})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: "'2'"

Проблема 7: Это "целое число" действительно должно быть задокументировано как "десятичное число" ... 0x22 и 0b11 обрабатываются как str, а 010 ("восьмеричное число") обрабатывается как 10, не 8:

>>> "{0[010]}".format('0123456789abcdef')
'a'

Обновление: PEP 3101 рассказывает правду:

Значит, мы можем использовать здесь не только целое число, не так ли? Да, есть две проблемы:

element_index является целым числом? Да, это работает с dict:

>>> "{0[2]}".format({2: 'int2'})
'int2'

Похоже, мы также можем использовать нецелочисленные строки, но для этого нужна более подробная документация (Проблема 5):

>>> "{0[foo]}".format({'foo': 'bar'})
'bar'

Но мы не можем использовать dict с ключом вроде ' 2 '(Проблема 6):

>>> "{0[2]}".format({'2': 'str2'})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 2
>>> "{0['2']}".format({'2': 'str2'})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: "'2'"

Проблема 7: Это "целое число" действительно должно быть задокументировано как "десятичное число" ... 0x22 и 0b11 обрабатываются как str, а 010 ("восьмеричное число") обрабатывается как 10, не 8:

>>> "{0[010]}".format('0123456789abcdef')
'a'

Обновление: PEP 3101 рассказывает правду:
"" "
Правила синтаксического анализа ключа элемента очень просты. Если он начинается с цифры, то он рассматривается как число, в противном случае он используется как строка.

Поскольку ключи не разделены кавычками, невозможно указать произвольные ключи словаря (например, строки "10 "или": -] ") из строки формата.
"" "

1
ответ дан 4 December 2019 в 13:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: