TypeError:“ NoneType”对象不可下标蟒蛇

时间:2020-05-13 10:05:27

标签: python python-3.x

我正在为Discord创建一个简单的USPS跟踪机器人。

使用Discord中的!usps TRACKING NUMBER命令

代码如下:

import shippo
import discord
import asyncio
import datetime

token = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
client = discord.Client()
shippo.config.api_key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

@client.event
async def on_ready():
    print('-------------------------')
    print('Logged in as')
    print(client.user.name)
    print(client.user.id)
    print('-------------------------')

@client.event
async def on_message(message):
    if message.author.bot:
        return

    if message.content.startswith('!help'):
        embed = discord.Embed(title="Help", description="Use `!uSps TRACKING NUMBER` to get started!", color=0x8B4513)
        embed.set_author(name="USPS Tracking", url="https://www.usps.com/", icon_url="https://www.freepnglogos.com/uploads/usps-png-logo/bridgeport-apartments-usps-png-logo-2.png")
        embed.set_thumbnail(url="https://www.freepnglogos.com/uploads/usps-png-logo/bridgeport-apartments-usps-png-logo-2.png")
        await message.channel.send(embed=embed)

    if message.content.startswith('!'):
        cmd = message.content.split()[0].lower()[1:]
        args = message.content.split()[1:]
        packageTrack = ' '.join(args)
        tracking_number = packageTrack
        carrier_token = 'usps'
        tracking = shippo.Track.get_status(carrier_token, tracking_number)
        d1 = datetime.datetime.strptime(tracking['tracking_status']['status_date'], "%Y-%m-%dT%H:%M:%SZ")
        new_format = "%m-%d-%Y" + " at " + "%H:%M"

        uspsStatus = tracking['tracking_status']['status_details'] + " - " + tracking['tracking_status']['status']
        uspsCity = tracking['tracking_status']['location']['city']
        uspsState = tracking['tracking_status']['location']['state']
        uspsZip = tracking['tracking_status']['location']['zip']
        uspsDate = d1.strftime(new_format)

        if uspsCity is None:
            print("Unavailable")
        elif uspsZip is None:
            print("Unavailable")
        elif uspsState is None:
            print("Unavailable")

        if cmd == 'usps':
            embed = discord.Embed(title="Tracking", color=0x8B4513)
            embed.set_author(name="USPS Tracking", url="https://tools.usps.com/go/TrackConfirmAction?tLabels={}".format(str(tracking_number)), icon_url="https://www.freepnglogos.com/uploads/usps-png-logo/bridgeport-apartments-usps-png-logo-2.png")
            embed.set_thumbnail(url="https://www.freepnglogos.com/uploads/usps-png-logo/bridgeport-apartments-usps-png-logo-2.png")
            embed.add_field(name="Tracking Number: ", value="{}".format(str(tracking_number)), inline=False)
            embed.add_field(name="Status: ", value="{}".format(str(uspsStatus)), inline=False)
            embed.add_field(name="Date & Time: ", value="{}".format(str(uspsDate)), inline=False)
            embed.add_field(name="Location: ", value="{}".format(str(uspsCity) + ", " + str(uspsState) + " " + str(uspsZip)), inline=False)
            await message.channel.send(embed=embed)

client.run(token)

Line 40上,uspsCity = tracking['tracking_status']['location']['city']出现了TypeError: 'NoneType' object is not subscriptable错误。如您所见,我试图以我认为可行的方式解决它,但它仍然会写入错误。列表和字典仍然让我有些困惑,所以这可能就是为什么我没有得到它的原因。

1 个答案:

答案 0 :(得分:0)

此错误表示您尝试获取所有内容(无)。

tracking = shippo.Track.get_status(carrier_token, tracking_number)

我猜这个函数返回None。为了避免这种情况,请添加例如if语句(也可以尝试/捕获):

if tracking not None:    
    uspsStatus = tracking['tracking_status']['status_details'] + " - " + tracking['tracking_status']['status']
    uspsCity = tracking['tracking_status']['location']['city']
    uspsState = tracking['tracking_status']['location']['state']
    uspsZip = tracking['tracking_status']['location']['zip']
相关问题