Python - объект 'NoneType' не подлежит подписке (небольшая программа для цены предметов Steam) - PullRequest
2 голосов
/ 21 июня 2020

Итак, я сделал эту небольшую программу, чтобы обновить самую низкую_цену определенного c элемента на Steam Market, она запускает al oop и получает json ответ.

Сначала она работает нормально, отображает цену, но через некоторое время показывает ошибку.

Код программы:

import json
import requests

def GetPrice () :

    response = requests.get ('https://steamcommunity.com/market/priceoverview/?appid=264710&currency=1&market_hash_name=Planet%204546B%20Postcard')

    json_data = {}
    json_data = json.loads (response.text)

    return json_data ["lowest_price"]

while True :

    print (GetPrice ())

Вот результат работы программы:

$1.03
$1.03
$1.03
$1.03
$1.03
$1.03
$1.03
$1.03
$1.03
$1.03
$1.03
$1.03
$1.03
$1.03
$1.03
$1.03
$1.03
$1.03
$1.03
$1.03
$1.03
$1.03
Traceback (most recent call last):
  File "C:\Users\Admin\Desktop\item_price.py", line 16, in <module>
    print (GetPrice ())
  File "C:\Users\Admin\Desktop\item_price.py", line 12, in GetPrice
    return json_data ["lowest_price"]
TypeError: 'NoneType' object is not subscriptable
[Finished in 20.2s]

Ответы [ 4 ]

3 голосов
/ 21 июня 2020

Эта ошибка возникает, когда вы пытаетесь проиндексировать объект типа None (то есть: объект не имеет значения).

Здесь ваш None объект - это ваша json_data переменная, это означает, что json.loads (response.text) возвращает None.

Вы можете избежать этой ошибки, добавив оператор if, который будет проверять, не является ли значение None:

if json_data is not None:
    return json_data['lowest_price']
return None

Или с оператор try-except:

try:
    return json_data['lowest_price']
except Exception as e:
    return None    # or you can raise an exception if you want
3 голосов
/ 21 июня 2020

У вас возникла эта проблема, поскольку вы очень быстро делаете слишком много запросов к серверу.

Чтобы указать c, сервер отвечает кодом ошибки http 429

Подождите несколько секунд перед отправкой последовательных запросов.

0 голосов
/ 21 июня 2020

Так что иногда вы получаете пустой ответ, который вызывает проблему

try:
    price = json_data ["lowest_price"]
except Exception as e:
    pass
0 голосов
/ 21 июня 2020

Проверьте, что ваша переменная содержит правильные данные. если json_data ничего не содержит, вы не сможете получить значение. Скажем, json_data - это None, вам нужно проверить переменную.

Подход 1

try:
    return json_data["lowest_price"]
except Exception as e:
    print(json_data)
    print(e)
    return None

Подход 2

Вы можете явно проверить json_data значение переменной

if json_data != None:
    if "lowest_price" in json_data:
        return json_data["lowest_price"]
...