Python:isalpha() 函数中出现 NoneType 错误
Python : NoneType error in isalpha() function
我目前在 Python 中遇到 NoneType 和使用函数 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”有关。谢谢你的建议:)
你的问题是不是所有的路径都通过你的check_chars()
函数return一个值。因此,有时(具体来说,在你的情况下,当 tmp
包含 '\n'
时)这个:
tmp = check_chars(tmp,x)
将 None
赋值给 tmp
,然后下次调用 check_chars()
时,会这样:
tmp.isalpha()
试图在 None
上调用 isalpha()
并导致您的问题。
解决办法是确保所有路径通过check_chars()
return一个值。
我同意保罗·格里菲斯的观点。我建议您在使用 check_chars() 之前或在其中检查分隔符和运算符,因为这会由于 returned tmp 而导致错误。注意:不处理数字。
这是处理错误时的完整输出,以便您参考要处理的案例。注意:我在 check_chars() 中使用 "except" 时使用 return "",只是为了避免下次出现另一个错误。我还在输入 x 之前使用 "x = x.strip()" 以避免 newline/whitespace 字符(除非你想要它们)。
另请注意,我使用“<<”和“>>”来包含变量的值。
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
(致读者:有什么方法可以减少这种输出,例如剧透?)
我目前在 Python 中遇到 NoneType 和使用函数 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”有关。谢谢你的建议:)
你的问题是不是所有的路径都通过你的check_chars()
函数return一个值。因此,有时(具体来说,在你的情况下,当 tmp
包含 '\n'
时)这个:
tmp = check_chars(tmp,x)
将 None
赋值给 tmp
,然后下次调用 check_chars()
时,会这样:
tmp.isalpha()
试图在 None
上调用 isalpha()
并导致您的问题。
解决办法是确保所有路径通过check_chars()
return一个值。
我同意保罗·格里菲斯的观点。我建议您在使用 check_chars() 之前或在其中检查分隔符和运算符,因为这会由于 returned tmp 而导致错误。注意:不处理数字。
这是处理错误时的完整输出,以便您参考要处理的案例。注意:我在 check_chars() 中使用 "except" 时使用 return "",只是为了避免下次出现另一个错误。我还在输入 x 之前使用 "x = x.strip()" 以避免 newline/whitespace 字符(除非你想要它们)。 另请注意,我使用“<<”和“>>”来包含变量的值。
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
(致读者:有什么方法可以减少这种输出,例如剧透?)