#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)