2016-12-05 2 views
0

Je suis actuellement bloqué par un problème avec NoneType et j'utilise la fonction isalpha() en Python. Ce que je veux faire est l'analyse lexicale et je veux diviser le code entier en quatre catégories. Voici mon codePython: Erreur NoneType dans la fonction isalpha()

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 = "" 

Quand j'arrive fin d'une première ligne d'un exemple de programme qui est le suivant:

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) 

Une erreur se produit:

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' 

Je ne serais pas surpris si l'erreur augmente au début du programme. Mais comment est-il possible qu'il se lève en fin de ligne? Est-il possible que l'erreur soit en quelque sorte liée au caractère de fin de ligne "\ n". Merci pour vos suggestions :)

Répondre

0

Votre problème est que tous les chemins de votre fonction check_chars() ne renvoient pas une valeur. Par conséquent, parfois (en particulier, dans votre cas, lorsque tmp contient '\n') ceci:

tmp = check_chars(tmp,x) 

attribue None-tmp, puis la prochaine fois que vous appelez check_chars(), ceci:

tmp.isalpha() 

tentatives d'appel isalpha() sur None, et provoque votre problème.

La solution consiste à s'assurer que tous les chemins passant par check_chars() renvoient une valeur.

+0

Merci pour votre aide :) Paul –

0

Je suis d'accord avec Paul Griffiths. Je vous suggère de mettre la vérification des séparateurs et des opérateurs avant d'utiliser check_chars() ou à l'intérieur, car cela provoque une erreur due au tmp retourné. Remarque: les numéros ne sont pas gérés.

Voici la sortie complète qui se produit lorsque les erreurs sont gérées, de sorte que vous référencez les cas à gérer. Note: J'utilise return "" quand j'utilise "except" dans check_chars(), juste pour éviter une autre erreur la prochaine fois. J'utilise aussi "x = x.strip()" avant d'entrer x pour éviter les caractères newline/whitespace (sauf si vous les voulez). Notez également que j'utilise "< <" et ">>" pour contenir les valeurs des variables.

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 

(Pour les lecteurs: Est-il possible de minimiser cette sortie, par exemple spoiler?)

+0

Merci Ben pour l'aide :) –