美文网首页
新手常见的python报错及解决方案

新手常见的python报错及解决方案

作者: 孙青儿 | 来源:发表于2019-02-26 23:45 被阅读0次

    目录

    1.NameError变量名错误

    2.IndentationError代码缩进错误

    3.AttributeError对象属性错误

    4.TypeError类型错误

    5.IOError输入输出错误

    6.KeyError字典键值错误

    1.NameError变量名错误 

    点击返回目录

    报错:

    >>> print a

    Traceback (most recent call last):

    File "", line 1, in

    NameError: name 'a' is not defined

    解决方案:

    先要给a赋值。才能使用它。在实际编写代码过程中,报NameError错误时,查看该变量是否赋值,或者是否有大小写不一致错误,或者说不小心将变量名写错了。

    注:在Python中,无需显示变量声明语句,变量在第一次被赋值时自动声明。

    >>> a=1

    >>> print a

    1

    2.IndentationError代码缩进错误

    点击返回目录

    代码:

    a=1b=2if a

    print a

    报错:

    IndentationError: expected an indented block

    原因:

    缩进有误,python的缩进非常严格,行首多个空格,少个空格都会报错。这是新手常犯的一个错误,由于不熟悉python编码规则。像def,class,if,for,while等代码块都需要缩进。

    缩进为四个空格宽度,需要说明一点,不同的文本编辑器中制表符(tab键)代表的空格宽度不一,如果代码需要跨平台或跨编辑器读写,建议不要使用制表符。

    解决方案:

    a=1b=2if a

        print a

    3.AttributeError对象属性错误 

    点击返回目录

    报错:

    >>> import sys

    >>> sys.Path

    Traceback (most recent call last):

    File "", line 1, in

    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.TypeError类型错误

    点击返回目录

    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:显式等待'''fromseleniumimport webdriverfromselenium.webdriver.common.byimport Byfromselenium.webdriver.support.uiimport WebDriverWaitfromselenium.webdriver.supportimport expected_conditions as ECfromtimeimport 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):

      File "D:\system files\workspace\selenium\autotestcombat\test_4_7_1_webdriverwait.py", line 18, in <module>

        element=WebDriverWait(driver,5,0.5).until(EC.visibility_of_element_located(*loc))

    TypeError: __init__() takes exactly 2 arguments (3 given)

    原因:

    类的函数__init__()需要两个参数,但实际上给了三个。

    EC.visibility_of_element_located类的入参应该是两个入参: self和元组。但却给了三个参数 self和*loc中的两个元素作为入参。

    解决方案:

    这里要将EC.visibility_of_element_located(*loc)改为EC.visibility_of_element_located(loc),入参为元组,而不是元组里边的两个值。

    python知识拓展:

    关于入参*的用法

    以元组作为函数入参,如果元组前加*号,说明传递的入参为元组中的各个元素。如果元组前没有加*号,说明传递的入参为元组本身。

    举例说明:

    loc =(By.NAME,'email')

    element1=WebDriverWait(driver,5,0.5).until(EC.visibility_of_element_located(loc)) #只要一个参数(不考虑self情况下),元组loc,即:(By.NAME,'email')。 直接传loc。

    element2=driver.find_element(*loc)#需要两个参数,元组loc的元素,即:By.NAME,'email'。直接传*loc

    4.2.2其他

    报错:

    >>> import os

    >>> os.listdir()

    Traceback (most recent call last):

    File "", line 1, in

    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 "", line 1, in

    TypeError: 'tuple' object is not callable

    原因:

    t为元组,元组不能被调用,不能加()。初学者编写代码时,偶尔粗心会将变量当做方法来调用(不小心加了括号)。所以要认真检查下是否变量加了括号,或者方法漏加了括号。

    解决方案:

    将括号去除。

    >>> t

    ('a', 'b', 'c')

    5.IOError输入输出错误

    点击返回目录

    5.1文件不存在报错

    报错:

    >>> f=open("Hello.py")

    Traceback (most recent call last):

    File "", line 1, in

    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 "", line 1, in

    IOError: File not open for writing

    原因:

    open("hello.py")如果入参没有加读写模式参数mode,说明默认打开文件的方式为只读方式,而此时又要写入字符,所以权限受限,才会报错。

    解决方案:

    更改模式

    >>> f=open("hello.py",'w+')

    >>> f.write("test")

    6.KeyError字典键值错误

    点击返回目录

    报错:

    常见报错有,测试一接口,接口返回数据一般是json格式,而测试该接口校验某个值是否正确,如果key拼写错了,就会报KeyError。简单举例如下:

    >>> d={'a':1,'b':2,'c':3}

    >>> print d['a']

    1

    >>> print d['f']

    Traceback (most recent call last):

    File "", line 1, in

    KeyError: 'f'

    解决方案:

    访问d中有的键值,如a,b或c。

    相关文章

      网友评论

          本文标题:新手常见的python报错及解决方案

          本文链接:https://www.haomeiwen.com/subject/xzutuqtx.html