开发者问题收集

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