2016-12-05 17 views
0

В настоящее время я застрял в проблеме с NoneType и использовал функцию isalpha() в Python. То, что я хочу сделать, - лексический анализ, и я хочу разделить весь код на четыре категории. Вот мой кодPython: NoneType error in isalpha() function

import sys 
import keyword #keyword.iskeyword() 

**strong text**def check_chars(tmp,x): 
if (tmp == "" or tmp.isalpha()) and (x =="" or x.isalpha()): 
    if keyword.iskeyword(tmp): 
     print("Key: "+ tmp) 
     return "" 
    return tmp+x  
if tmp.isalpha() and not x.isalpha(): 
    print("Var: "+tmp) 
    return x   


separators = ['(',')','[',']','{','}',',',':','.',';','@','=','->','+=','-=','*=','/=','//=','%=','@=','&=','|=','^=','>>=','<<=','**='] 
operators = ['+','-','*','**','/','//','%','<<','>>','&','|','^','~','<','>','<=','>=','==','!='] 

f = open(sys.argv[1],'r') 
program = f.read() 

tmp = "" 
for x in program: 

tmp = check_chars(tmp,x) 
if tmp in separators: 
    print("Sep: "+ tmp) 
    tmp = "" 
if tmp in operators:  
    print("Ope: "+ tmp) 
    tmp = "" 
if x is " ": 
    tmp = "" 

Когда я достигаю конец первой строки в примере программы, которая это:

def funkce(a,b): 
c='' 
a**=b 
if a<b: 
    print('ahoj\'ky',a) 
else: 
    print(0xff,0b11101,0o777,.90e-10,123E+5,c) 
    print('''To je dlouhy 
    retezec pres mnoho 
    radku''') 
funkce(-256+356,.85**.33) 

возникает ошибка:

Traceback (most recent call last): 
File "HW09.py", line 24, in <module> 
tmp = check_chars(tmp,x) 
File "HW09.py", line 5, in check_chars 
if (tmp == "" or tmp.isalpha()) and (x =="" or x.isalpha()): 
AttributeError: 'NoneType' object has no attribute 'isalpha' 

Я не был бы удивлен, если ошибка повышается при начале программы. Но как возможно, что он поднимается в конце линии? Возможно ли, что ошибка каким-то образом связана с символом конца строки «\ n». Спасибо за предложения :)

ответ

0

Ваша проблема в том, что не все пути через вашу функцию check_chars() возвращают значение. Поэтому иногда (в частности, в вашем случае, когда tmp содержит '\n') это:

tmp = check_chars(tmp,x) 

назначает None к tmp, а затем в следующий раз, когда вы называете check_chars(), это:

tmp.isalpha() 

попытки вызова isalpha() на None, и вызывает вашу проблему.

Решение состоит в том, чтобы убедиться, что все пути через check_chars() возвращают значение.

+0

Спасибо за вашу помощь :) Paul –

0

Я согласен с Полом Гриффитсом. Я предлагаю вам установить проверку для разделителей и операторов перед использованием check_chars() или внутри него, так как это вызывает ошибку из-за возвращаемого tmp. Примечание: номера не обрабатываются.

Вот полный вывод, который возникает при обработке ошибок, поэтому вы ссылаетесь на обрабатываемые случаи. Примечание. Я использую return «" при использовании «except» в check_chars(), чтобы избежать другой ошибки в следующий раз. Я также использую «x = x.strip()» перед вводом x, чтобы избежать символов новой строки/пробелов (если вы не хотите их). Также обратите внимание, что «< <» и «>>» содержит значения переменных.

Key: def 
Var: funkce 
Sep: (
Var: a 
Sep: , 
Var: b 
Sep:) 
An error occurred. x=<<>>, tmp=<<None>> 
Var: c 
Sep: = 
An error occurred. x=<<'>>, tmp=<<None>> 
Var: a 
Ope: * 
An error occurred. x=<<=>>, tmp=<<None>> 
Var: bifa 
Ope: < 
Var: b 
Sep: : 
Var: print 
Sep: (
An error occurred. x=<<a>>, tmp=<<None>> 
Var: hoj 
An error occurred. x=<<k>>, tmp=<<None>> 
Var: y 
An error occurred. x=<<a>>, tmp=<<None>> 
An error occurred. x=<<>>, tmp=<<None>> 
Var: else 
Sep: : 
Var: print 
Sep: (
An error occurred. x=<<x>>, tmp=<<None>> 
Var: ff 
Sep: , 
An error occurred. x=<<b>>, tmp=<<None>> 
An error occurred. x=<<1>>, tmp=<<None>> 
An error occurred. x=<<0>>, tmp=<<None>> 
An error occurred. x=<<,>>, tmp=<<None>> 
An error occurred. x=<<o>>, tmp=<<None>> 
An error occurred. x=<<7>>, tmp=<<None>> 
An error occurred. x=<<,>>, tmp=<<None>> 
An error occurred. x=<<9>>, tmp=<<None>> 
An error occurred. x=<<e>>, tmp=<<None>> 
An error occurred. x=<<1>>, tmp=<<None>> 
An error occurred. x=<<,>>, tmp=<<None>> 
An error occurred. x=<<2>>, tmp=<<None>> 
An error occurred. x=<<E>>, tmp=<<None>> 
An error occurred. x=<<5>>, tmp=<<None>> 
An error occurred. x=<<c>>, tmp=<<None>> 
An error occurred. x=<<>>, tmp=<<None>> 
Var: print 
Sep: (
An error occurred. x=<<'>>, tmp=<<None>> 
An error occurred. x=<<T>>, tmp=<<None>> 
Var: ojedlouhyretezecpresmnohoradku 
An error occurred. x=<<'>>, tmp=<<None>> 
An error occurred. x=<<>>, tmp=<<None>> 
Var: funkce 
Sep: (
An error occurred. x=<<2>>, tmp=<<None>> 
An error occurred. x=<<6>>, tmp=<<None>> 
An error occurred. x=<<3>>, tmp=<<None>> 
An error occurred. x=<<6>>, tmp=<<None>> 
An error occurred. x=<<.>>, tmp=<<None>> 
An error occurred. x=<<5>>, tmp=<<None>> 
An error occurred. x=<<*>>, tmp=<<None>> 
An error occurred. x=<<3>>, tmp=<<None>> 
An error occurred. x=<<)>>, tmp=<<None>> 

Process finished with exit code 0 

(Для читателей: Есть ли какой-нибудь способ, чтобы минимизировать этот выход, например, спойлер?)

+0

Спасибо Бену за помощь :) –