TypeError: 'NoneType' 对象不可下标,即使使用 if 条件检查 var 并将其设置为静态值
2023-01-01
164
我正在尝试编写一个用于网页抓取的原型。我的问题是,当
duetpartner = track['duet']['handle']
为 null 或 NoneType 时,标题中会出现错误。
问题是我已经对其进行了检查,如果为 None,我会将其设置为静态值:
def create_song_list(track):
if track['duet']['handle'] is not None:
duetpartner = track['duet']['handle']
else:
duetpartner= 'Solo'
return {
'Duet_partner': duetpartner
}
我从数组中调用
create_song_list
。
如果需要更多代码来重现,我会提供它,我尽量将其保持在最低限度。
类似的问题中的简单解决方案已经过期,但对我来说它仍然是 NoneType...: Discord.py TypeError: 'NoneType' 对象不可下标
更新1:
添加
或 track['duet']
条件没有帮助……
2个回答
这可能有助于您了解正在发生的事情。假设我们有 3 个字典:
d1 = {'foo': 'banana'}
d2 = {'duet': {'foo': 'banana'}}
d3 = {'duet': {'handle': 'banana'}}
现在我们要确定一个字典是否有 'duet' 键 以及 它的值(我们假设是另一个字典)是否有 'handle' 键:
for d in d1, d2, d3:
print(d.get('duet', dict()).get('handle'))
结果为:
None
None
banana
...希望这是合理的。
这意味着原始问题中的函数可以这样更改:
def create_song_list(track):
v = track.get('duet', {'handle': 'Solo'}).get('handle', 'Solo')
return {'Duet_partner': v}
当然,这只有在 track 是字典 并且 与 duet 关联的值也是字典时才会起作用。
因此,一种极其稳健的方法可能是:
def create_song_list(track):
if isinstance(track, dict):
if (duet := track.get('duet')) is not None:
if isinstance(duet, dict):
if (handle := duet.get('handle')) is not None:
return {'Duet_partner': handle}
return {'Duet_partner': 'Solo'}
SIGHUP
2023-01-01
您可以将代码更改为类似 -
def create_song_list(track):
if track['duet'] is not None and track['duet']['handle'] is not None:
duetpartner = track['duet']['handle']
else:
duetpartner= 'Solo'
return {
'Duet_partner': duetpartner
}
Rajkumar Hajgude
2023-01-01