Python — TypeError: аргумент типа «NoneType» не является итерируемым

Я новичок в питоне, поэтому, пожалуйста, потерпите меня. Я написал скрипт для проверки имени оператора на моем 3G-ключе с помощью python-pyserial, в основном это выглядит так:

def get_operator():   
    ID_OPSEL=('51011:XL-Axiata','51010:Telkomsel','51089:Three','51001:Indosat','INDOSAT:Indosat','51008:Axis','TELKOMSEL:Telkomsel')
    if TYPE=="ZTE":
        resp=send_at_wait('AT+COPS?','+COPS:',3)
        if resp<>"TIMEOUT":
            resp=get_value(resp,'+COPS:')
            return resp.spilt('"')[1]
    else:    
        resp= send_at_wait("AT+COPS?; +COPS?\r","+COPS:",3)
        if resp<>"TIMEOUT":
            resp=get_value(resp,'+COPS:')
            resp=resp.split(',')
            if len(resp)>2: 
                resp=resp[2].replace('"','')
                for ln in ID_OPSEL:
                    if ln.find(resp)<>-1:
                        return ln.split(':')[1]
            else:
                return "Not Registered"

op=get_operator()
if "Not Registered" in op:
    print "No Signal"
else:
    print "Operator Name: " + op

Когда есть прием, все работает нормально, но когда приема нет, скрипт возвращает:

Traceback (most recent call last):
  File "/usr/bin/gsm", line 639, in <module>
    if "Not Registered" in op:
TypeError: argument of type 'NoneType' is not iterable

Как мне это исправить?


person hillz    schedule 22.05.2016    source источник


Ответы (3)


Вы получаете эту ошибку, потому что проверяете, содержит ли op строку "Not Registered", когда op на самом деле является None во время выполнения конкретного запуска, который завершился неудачно.

Вы должны проверить, является ли op None, прежде чем использовать его в предложениях if и else.

Что-то вроде этого будет обрабатывать этот случай:

if op is None:
    print "No operator"

if "Not Registered" in op:
    print "No Signal"
else:
    print "Operator Name: " + op
person ShacharSh    schedule 22.05.2016

Ваш op НЕ всегда возвращает строку.

Например. когда TYPE‹>"ZTE" и resp=="TIMEOUT", он (по умолчанию) возвращает значение None.

person Lei Shi    schedule 22.05.2016

Вы можете использовать его следующим образом:

op=get_operator()

try:
  if "Not Registered" in op:
     print "No Signal"
  else:
     print "Operator Name: " + op
except:
  print("Error occurred")
person Hishan_98    schedule 18.03.2020