如何解决字典TypeError的Python列表仅包含列表中的一项?

Mat*_*Cox -2 python python-3.x

如何通过一个项目列表克服TypeError?我有此字典清单:

    ADSR_Dbs = {'Tables' : (
    {'Table' : 'ACSL',
    'columns': ('ID','Loc','Pos')
    'type': ('int','varchar','varchar')
    }
)}
Run Code Online (Sandbox Code Playgroud)

这会产生TypeError:当我尝试这样做时,字符串索引必须是整数:

for DBTables in ADSR_Dbs['Tables']:
    print("Table: " + DBTables['Table'])
Run Code Online (Sandbox Code Playgroud)

但是,如果列表中还有更多项目,可以这样:

ADSR_Dbs = {'Tables' : (
    {'Table' : 'ACSL',
    'columns': ('ID','Loc','Pos')
    'type': ('int','varchar','varchar')
    },
    {'Table':None,
    'columns':(None),
    'type':(None)
    }
)}
Run Code Online (Sandbox Code Playgroud)

有时列表中只有一项,所以如何避免TypeError?

vur*_*mux 5

在Python中,用()括号创建元组。但是这些符号还有很多提及:对于函数,对于代码的逻辑块等。因此,如果要创建一个元素元组,则应将其编写为:(element, )用逗号分隔,这样Python解释器将知道它确实是一个元组,而不是括号中的代码。就您而言,您只有一个普通的字典。如果您想要一堆字典,您应该写一个逗号:

ADSR_Dbs = {'Tables' : (
    {'Table' : 'ACSL',
    'columns': ('ID','Loc','Pos'),
    'type': ('int','varchar','varchar')
    },
     ^
     |
     +----------------- HERE
)}
Run Code Online (Sandbox Code Playgroud)

因此,代码将是:

ADSR_Dbs = {'Tables' : (
    {'Table' : 'ACSL',
    'columns': ('ID','Loc','Pos'),
    'type': ('int','varchar','varchar')
    },
)}
for DBTables in ADSR_Dbs['Tables']:
    print("Table: " + DBTables['Table'])
Run Code Online (Sandbox Code Playgroud)

Table: ACSL

但是,当在一个元组中有多个元素时,Python会知道它是一个元组,因此当您有2个以上的元素时,您的代码将开始工作。请注意,该列表没有此问题。[element]是一个元素列表,您不需要逗号。