python-3.x TypeError:“NoneType”对象不可订阅,即使使用if条件检查var并将其设置为静态值,否则也是如此

wsxa1bj1  于 2023-01-03  发布在  Python
关注(0)|答案(2)|浏览(122)

我正在尝试写一个Web抓取的原型。我的问题是当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' object is not subscriptable

更新1:

添加or track['duet']条件没有帮助...

7kjnsjlb

7kjnsjlb1#

这可能会帮助你理解正在发生的事情。让我们有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'}
qv7cva1a

qv7cva1a2#

你可以修改你的代码-

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
    }

相关问题