此篇文章整理新手编写代码常见的一些错误,有些错误是粗心的错误,但对于新手而已,会折腾很长时间才搞定,所以在此总结下我遇到的一些问题。希望帮助到刚入门的朋友们。后续会不断补充。
报错:
>>> print a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name \'a\' is not defined
解决方案:
先要给a赋值。才能使用它。在实际编写代码过程中,报NameError错误时,查看该变量是否赋值,或者是否有大小写不一致错误,或者说不小心将变量名写错了。
注:在Python中,无需显示变量声明语句,变量在第一次被赋值时自动声明。
>>> a=1
>>> print a
1
代码:
a=1
b=2
if a<b:
print a
报错:
IndentationError: expected an indented block
原因:
缩进有误,python的缩进非常严格,行首多个空格,少个空格都会报错。这是新手常犯的一个错误,由于不熟悉python编码规则。像def,class,if,for,while等代码块都需要缩进。
缩进为四个空格宽度,需要说明一点,不同的文本编辑器中制表符(tab键)代表的空格宽度不一,如果代码需要跨平台或跨编辑器读写,建议不要使用制表符。
解决方案:
a=1
b=2
if a<b:
print a
报错:
>>> import sys
>>> sys.Path
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: \'module\' object has no attribute \'Path\'
原因:
sys模块没有Path属性。
解决方案:
python对大小写敏感,Path和path代表不同的变量。将Path改为path即可。
>>> sys.path
[\'\', \'/usr/lib/python2.6/site-packages\']
python知识拓展:
使用dir函数查看某个模块的属性
>>> dir(sys)
[\'__displayhook__\', \'__doc__\', \'__egginsert\', \'__excepthook__\', \'__name__\', \'__package__\', \'__plen\', \'__stderr__\', \'__stdin__\', \'__stdout__\', \'_clear_type_cache\', \'_current_frames\', \'_getframe\', \'api_version\', \'argv\', \'builtin_module_names\', \'byteorder\', \'call_tracing\', \'callstats\', \'copyright\', \'displayhook\', \'dont_write_bytecode\', \'exc_clear\', \'exc_info\', \'exc_type\', \'excepthook\', \'exec_prefix\', \'executable\', \'exit\', \'flags\', \'float_info\', \'getcheckinterval\', \'getdefaultencoding\', \'getdlopenflags\', \'getfilesystemencoding\', \'getprofile\', \'getrecursionlimit\', \'getrefcount\', \'getsizeof\', \'gettrace\', \'hexversion\', \'maxint\', \'maxsize\', \'maxunicode\', \'meta_path\', \'modules\', \'path\', \'path_hooks\', \'path_importer_cache\', \'platform\', \'prefix\', \'ps1\', \'ps2\', \'py3kwarning\', \'setcheckinterval\', \'setdlopenflags\', \'setprofile\', \'setrecursionlimit\', \'settrace\', \'stderr\', \'stdin\', \'stdout\', \'subversion\', \'version\', \'version_info\', \'warnoptions\']
4.1入参类型错误
代码:
t=(\'a\',\'b\',\'c\')
for i in range(t):
print a[i]
报错:
TypeError: range() integer end argument expected, got tuple.
原因:
range()函数期望的入参是整型(integer),但却给的入参为元组(tuple)
解决方案:
将入参元组t改为元组个数整型len(t)
将range(t)改为range(len(t))
4.2入参个数错误
4.2.1关于元组作为入参
代码:
# coding=utf-8 \'\'\' Created on 2016-7-21 @author: Jennifer Project:显式等待 \'\'\' from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from time import ctime driver=webdriver.Firefox() driver.get(r\'http://www.baidu.com/\') loc=(By.ID,\'kw\') print ctime() element=WebDriverWait(driver,5,0.5).until(EC.visibility_of_element_located(*loc)) element.send_keys(\'selenium\') print ctime() driver.quit()
报错:
Traceback (most recent call last):
4.2.2其他
报错:
>>> import os
>>> os.listdir()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: listdir() takes exactly 1 argument (0 given)
原因:
listdir()函数需要一个入参,但是只给了0个入参。
解决方案:
加一个入参
>>> os.listdir(\'/home/autotest\')
[\'hello.py\', \'email126pro\']
python知识拓展:
如何查看某个函数的使用,可以使用help查看。
>>> help(os.listdir)
Help on built-in function listdir in module posix:
listdir(...)
listdir(path) -> list_of_strings
Return a list containing the names of the entries in the directory.
path: path of directory to list
说明:os.listdir()函数需要一个path路径入参,函数结果返回值是由字符串组成的列表。
4.3非函数却以函数来调用
报错:
>>> t=(\'a\',\'b\',\'c\')
>>> t()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: \'tuple\' object is not callable
原因:
t为元组,元组不能被调用,不能加()。初学者编写代码时,偶尔粗心会将变量当做方法来调用(不小心加了括号)。所以要认真检查下是否变量加了括号,或者方法漏加了括号。
解决方案:
将括号去除。
>>> t
(\'a\', \'b\', \'c\')
5.1文件不存在报错
报错:
>>> f=open("Hello.py")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: [Errno 2] No such file or directory: \'Hello.py\'
原因:
open()函数没有指明mode,默认为只读方式,如果该目录下没有Hello.py的文件,则会报错,可查看是否拼写有错误,或者是否大小写错误,或者根本不存在这个文件。
解决方案:
该目录下有hello.py文件,打开该文件即可。
>>> f=open("hello.py")
python知识拓展:
如何查看python解释器当前路径:
>>> import os
>>> os.getcwd()
\'/home/autotest\'
查看python解释器当前路径下有哪些文件:
>>> os.listdir(\'/home/autotest\')
[\'hello.py\', \'email126pro\']
5.2因文件权限问题报错
报错:
>>> f=open("hello.py")
>>> f.write("test")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: File not open for writing
原因:
open("hello.py")如果入参没有加读写模式参数mode,说明默认打开文件的方式为只读方式,而此时又要写入字符,所以权限受限,才会报错。
解决方案:
更改模式
>>> f=open("hello.py",\'w+\')
>>> f.write("test")
报错:
常见报错有,测试一接口,接口返回数据一般是json格式,而测试该接口校验某个值是否正确,如果key拼写错了,就会报KeyError。简单举例如下:
>>> d={\'a\':1,\'b\':2,\'c\':3}
>>> print d[\'a\']
1
>>> print d[\'f\']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: \'f\'
解决方案:
访问d中有的键值,如a,b或c。