0

我目前遇到了 NoneType 的问题并在 Python 中使用函数 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 = ""

当我到达示例程序中第一行的末尾时:

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”有关。谢谢你的建议:)

4

2 回答 2

0

您的问题是并非所有通过您的check_chars()函数的路径都返回一个值。因此,有时(特别是在您的情况下,何时tmpcontains '\n'):

tmp = check_chars(tmp,x)

分配Nonetmp,然后下次你调用check_chars(),这个:

tmp.isalpha()

尝试调用isalpha()None并导致您的问题。

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

于 2016-12-06T02:44:33.867 回答
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

(致读者:有什么方法可以最小化这种输出,例如扰流板?)

于 2016-12-06T03:16:43.517 回答