2016-12-05 26 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

感謝您對本幫助:) –