zoukankan      html  css  js  c++  java
  • 新手常见的python报错及解决方案

    此篇文章整理新手编写代码常见的一些错误,有些错误是粗心的错误,但对于新手而已,会折腾很长时间才搞定,所以在此总结下我遇到的一些问题。希望帮助到刚入门的朋友们。后续会不断补充。

    目录

    1.NameError变量名错误

    2.IndentationError代码缩进错误

    3.AttributeError对象属性错误

    4.TypeError类型错误

    5.IOError输入输出错误

    6.KeyError字典键值错误

    1.NameError变量名错误 

    点击返回目录

    报错:

    >>> 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

    2.IndentationError代码缩进错误

    点击返回目录

    代码:

    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

    3.AttributeError对象属性错误 

    点击返回目录

    报错:

    >>> 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.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:显式等待
    '''
    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):

      File "D:system filesworkspaceseleniumautotestcombat est_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 "<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.IOError输入输出错误

    点击返回目录

    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")

    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 "<stdin>", line 1, in <module>
    KeyError: 'f'

    解决方案:

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

  • 相关阅读:
    保持URL不变和数字验证
    centOS ftp key?
    本地环境测试二级域名
    linux 解决You don't have permission to access 问题
    php smarty section loop
    php header Cannot modify header information headers already sent by ... 解决办法
    linux部分命令
    Linux 里面的文件操作权限说明
    用IT网络和安全专业人士视角来裁剪云的定义
    SQL Server 2008 R2炫酷报表"智"作有方
  • 原文地址:https://www.cnblogs.com/yufeihlf/p/6068589.html
Copyright © 2011-2022 走看看