Почему я не могу определить значение None из словаря

#json #python-3.x #nonetype

Вопрос:

Я видел, как эта проблема много раз случалась со многими людьми (здесь). Я все еще пытаюсь проверить, является ли то, что мой словарь захватывает из JSON, «Нет» или нет, но я все равно получаю следующую ошибку. Этот код должен вызывать ЗАВИТОК, ищущий значение «закрыто» в ключе «статус», пока он не найдет его (или 10 раз). Когда оплата производится с помощью QR-кода, статус меняется с открытого на закрытый.

 status = (my_dict['elements'][0]['status'])

TypeError: 'NoneType' object is not subscriptable
 

Любая подсказка о том, что я делаю не так и как я могу это исправить?
Кроме того, если я запускаю часть сценария, которая вызывает автономный JSON, он каждый раз выполняется плавно. Есть ли в коде что-нибудь, что может повлиять на выполнение CURL?
Кстати, я начал программировать 1 неделю назад, поэтому, пожалуйста, извините меня, если я смешиваю концепции или говорю что-то, в чем не хватает здравого смысла.

Я попытался проверить IF с помощью «нет» вместо»!=», а также с помощью «Нет» вместо «».

 def show_qr():
reference_json = reference.replace(' ',' ') #replaces "space" with   for CURL assembly
url = "https://api.mercadopago.com/merchant_orders?external_reference="   reference_json #CURL URL concatenate
headers = CaseInsensitiveDict()
headers["Authorization"] = "Bearer MY_TOKEN"
pygame.init()
ventana = pygame.display.set_mode(window_resolution,pygame.FULLSCREEN) #screen settings
producto = pygame.image.load("qrcode001.png") #Qr image load
producto = pygame.transform.scale(producto, [640,480]) #Qr size
trials = 0 #sets while loop variable start value
status = "undefined" #defines "status" variable
while status != "closed" and trials<10: #to repeat the loop until "status" value = "closed"
    ventana.blit(producto, (448,192)) #QR code position setting
    pygame.display.update() #
    response = requests.request("GET", url, headers=headers) #makes CURL GET
    lag = 0.5 #creates an incremental 0.5 seconds everytime return value is None
    sleep(lag) #
    json_data = (response.text) #Captures JSON response as text
    my_dict = json.loads(json_data) #creates a dictionary with JSON data
    if json_data != "": #Checks if json_data is None
        status = (my_dict['elements'][0]['status']) #If json_data is not none, asigns 'status' key to "status" variable
    else:
        lag = lag   0.5 #increments lag
    trials = trials   1 #increments loop variable
    sleep (5) #time to avoid being banned from server.
    print (trials)
 

Ответ №1:

Из вашей первоначальной обнаруженной ошибки неясно, в чем проблема. Проблема в том, что в основном любая часть этого утверждения может привести к TypeError тому, что будет поднята, поскольку оцениваемая часть является нулевой. Например, учитывая my_dict['elements'][0]['status'] , что это может привести к сбою, если my_dict его нет, или также если my_dict['elements'] его нет.

Я бы попробовал вставить точки останова, чтобы лучше помочь в отладке причины. другим решением, которое могло бы помочь, было бы заключить каждую часть инструкции в try-catch блок, как показано ниже:

 my_dict = None


try:
    elements = my_dict['elements']
except TypeError as e:
    print('It possible that my_dict maybe None.')
    print('Error:', e)
else:

    try:
        ele = elements[0]
    except TypeError as e:
        print('It possible that elements maybe None.')
        print('Error:', e)
    else:

        try:
            status = ele['status']
        except TypeError as e:
            print('It possible that first element maybe None.')
            print('Error:', e)
        else:
            print('Got the status successfully:', status)