2016-12-05 29 views
0

我目前停留在问题NoneType和使用功能因而isalpha()在Python。我想要做的是词法分析,我想将整个代码分成四类。这是我的代码的Python:在因而isalpha NoneType错误()函数

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) 

下次呼叫check_chars()时间分配Nonetmp,然后,这一点:

tmp.isalpha() 

试图调用isalpha() on None,并导致您的问题。

的解决方案是,以确保通过check_chars()返回一个值的所有路径。

+0

谢谢您的帮助,保罗:) –

0

我同意保罗·格里菲斯。我建议你在使用check_chars()之前或者在它内部进行分隔符和运算符的检查,因为这会由于返回的tmp而导致错误。注意:不处理数字。

以下是完整的输出时错误的处理,使您对案件处理的基准而发生。注意:在check_chars()中使用“except”时,我使用return“”,以避免下次发生另一个错误。在输入x之前,我还使用“x = x.strip()”来避免换行符/空格字符(除非您需要它们)。 另外请注意我用“< <”和“>>”到包含变量的值。

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

感谢您对本帮助:) –