Как я могу обойти TypeError со списком из одного элемента? У меня есть этот список словаря:
ADSR_Dbs = {'Tables' : (
{'Table' : 'ACSL',
'columns': ('ID','Loc','Pos')
'type': ('int','varchar','varchar')
}
)}
который создает TypeError: индексы строк должны быть целыми числами когда я пытаюсь сделать это:
for DBTables in ADSR_Dbs['Tables']:
print("Table: " + DBTables['Table'])
Но если в списке больше элементов, это нормально, например:
ADSR_Dbs = {'Tables' : (
{'Table' : 'ACSL',
'columns': ('ID','Loc','Pos')
'type': ('int','varchar','varchar')
},
{'Table':None,
'columns':(None),
'type':(None)
}
)}
Иногда в списке есть только один элемент, так как мне избежать TypeError?
В Python кортежи создаются с помощью скобок ()
. Но у этих символов есть много других упоминаний: для функций, для логических блоков кода и т. д. Поэтому, если кто-то хочет создать одноэлементный кортеж, его следует написать так: (element, )
с запятой, чтобы интерпретатор Python знал, что это действительно кортеж, а не код в скобках. В вашем случае у вас есть просто обычный дикт. Если вам нужен кортеж диктов, вы должны написать запятую:
ADSR_Dbs = {'Tables' : (
{'Table' : 'ACSL',
'columns': ('ID','Loc','Pos'),
'type': ('int','varchar','varchar')
},
^
|
+----------------- HERE
)}
Итак, код будет:
ADSR_Dbs = {'Tables' : (
{'Table' : 'ACSL',
'columns': ('ID','Loc','Pos'),
'type': ('int','varchar','varchar')
},
)}
for DBTables in ADSR_Dbs['Tables']:
print("Table: " + DBTables['Table'])
Table: ACSL
Но когда у вас есть несколько элементов в кортеже, Python будет знать, что это кортеж, поэтому ваш код начнет работать, когда у вас будет 2+ элемента. Обратите внимание, что у списков нет этой проблемы. [element]
— это одноэлементный список, запятая не нужна.
Добавление запятой сработало! Это похоже на какой-то грязный код с запятой в конце, но полезно знать!!
«В Python кортежи создаются с помощью ()», но это не так. Скобки требуют иногда для устранения неоднозначности, но запятая — это то, что делает кортеж
В цикле
for
вы перебираете ключи в словареADSR_Dbs
. Я думаю, вам нужно перебрать пары ключ-значение с помощью.items()