TypeError: аргумент типа 'NoneType' не повторяется после оператора if - PullRequest
0 голосов
/ 28 ноября 2018

Я пытаюсь получить двухбуквенный код состояния города из пользовательского ввода, но получаю сообщение об ошибке «TypeError: аргумент типа« NoneType »не повторяется». Не уверен, как это исправить, чтобы получитьправильные результаты?Это строка с сообщением об ошибке:

if 'status' not in js or js['status'] != 'OK':

Ниже приведен полный код:

import urllib
import urllib.request as ur
import json

serviceurl = 'http://maps.googleapis.com/maps/api/geocode/json?'

while True:
    address = input('Enter location: ')
    if len(address) < 1 : break

    url = serviceurl + urllib.parse.urlencode({'sensor':'false', 'address': address})
    print ('Retrieving', url)
    uh = ur.urlopen(url)
    data = uh.read()
    print ('Retrieved',len(data),'characters')

    try: js = json.loads(str(data))
    except: js = None
    if 'status' not in js or js['status'] != 'OK':
        print ('==== Failure To Retrieve ====')
        print (data)
        continue

    print (json.dumps(js, indent=4))
    '''
    lat = js["results"][0]["geometry"]["location"]["lat"]
    lng = js["results"][0]["geometry"]["location"]["lng"]
    print ('lat',lat,'lng',lng)
    ''' #not necessary for this assignment
    location = js['results'][0]['formatted_address']
    print (location)

    results = js['results'][0]
    address_components = results["address_components"]
    country = 0;
    for each_dict in address_components:
        types = each_dict["types"]
        if types == ["country", "political"]:
            country = 1;
            print ("The two character country  code is:", each_dict["short_name"])

    if country == 0:
        print ("Location isn't in any country")

Ответы [ 3 ]

0 голосов
/ 28 ноября 2018

Я могу только догадываться, но похоже, что это из-за этого конкретного блока кода -

try: js = json.loads(str(data))
except: js = None
if 'status' not in js or js['status'] != 'OK':
    print ('==== Failure To Retrieve ====')
    print (data)
    continue

Ваш json.loads(str(data)) поднимает Exception из-за какой-то ошибки, так как он перехватывается exceptВы присваиваете

js = None

И в следующей строке вы делаете in сравнение js, но js равно None или NoneType, вы не можете перебрать NoneType,следовательно -

TypeError: argument of type 'NoneType' is not iterable

И вот подробнее об операторе in Python

0 голосов
/ 28 ноября 2018

Это довольно очевидно: если есть какое-либо исключение при загрузке информации JSON, вы устанавливаете js на None, но сразу же пытаетесь использовать его как последовательность.Добавление оператора print делает это понятным:

try: js = json.loads(str(data))
except: js = None

print("TRACE: js=", js)
if 'status' not in js or js['status'] != 'OK':

Вывод:

Enter location: Hillsborough
Retrieving http://maps.googleapis.com/maps/api/geocode/json?address=Hillsborough&sensor=false
Retrieved 279 characters
TRACE: js= None
Traceback (most recent call last):
  File "so.py", line 21, in <module>
    if 'status' not in js or js['status'] != 'OK':
TypeError: argument of type 'NoneType' is not iterable

Вместо этого выведите сообщение об ошибке и сообщение об ошибке и повторите цикл для следующей попытки:

try:
    js = json.loads(str(data))
except: 
    print("Map fetch failed; try again\n")
    continue

Вывод:

Enter location: Hillsborough
Retrieving http://maps.googleapis.com/maps/api/geocode/json?address=Hillsborough&sensor=false
Retrieved 279 characters
Map fetch failed; try again

Enter location: Chicago
Retrieving http://maps.googleapis.com/maps/api/geocode/json?address=Chicago&sensor=false
Retrieved 279 characters
Map fetch failed; try again
0 голосов
/ 28 ноября 2018

В коде:

try: js = json.loads(str(data))
except: js = None

Вы говорите Python, что если в json.loads выдается исключение, вы хотите установить js в None.Затем в следующем операторе if вы ссылаетесь непосредственно на js.Проблема здесь в том, что исключение действительно было выдано, но ваш код после этой проверки не учитывает это.Чтобы решить вашу проблему, вы должны изменить свой оператор if на:

if (not js or 'status' not in js or js['status'] != 'OK'):

, если вы хотите, чтобы операторы внутри оператора if выполнялись при ошибке.

В качестве отступления, пожалуйста,не используйте встроенные операторы try, except или if.Это делает ваш код очень сложным для отслеживания.

...