推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
dearmymy
V2EX  ›  Python

Python 函数同时返回错误值和数据怎么设计好

  •  
  •   dearmymy · Dec 3, 2019 · 6973 views
    This topic created in 2363 days ago, the information mentioned may be changed or developed.

    如果一个函数我都想返回一个 int 作为结果判断,比如 0 为成功,1,2,3 为其他错误值,同时也要返回函数数据,比较好的设计是什么样的。 def getUeser(): if xxx: return 1,None if xxx: return 2,None return 0,user 这样返回好像不是特别好么?

    看文章有的说是用抛异常? python 小白求教

    27 replies    2019-12-05 10:39:49 +08:00
    Leigg
        1
    Leigg  
       Dec 3, 2019 via Android
    一个函数,它的返回值的类型应该固定的。如果要满足你所说的需求,可以返回一个字典,如{return_code: "", value: ""}
    aver4vex
        2
    aver4vex  
       Dec 3, 2019
    返回元组或者字典
    ClericPy
        3
    ClericPy  
       Dec 3, 2019
    感觉像 golang 跑回来的, 但是 golang 返回的类型也是真 Error

    自己 try 住在 final 里 return ? 如果每个函数都要, 用装饰器是可以很容易装饰好的, 毕竟 python magic 太足了, 也符合装饰器模式, 对原始函数直接套, 和 golang 就很接近了

    最后判断错误只要 err 不是 None 就说明有错误了呗
    levelworm
        4
    levelworm  
       Dec 3, 2019
    抛异常我觉得也蛮好的,至少比返回 tuple 感觉舒服一些。
    superrichman
        5
    superrichman  
       Dec 3, 2019
    要我自己临时写我会返回一个 tuple, 但是更 pythonic 的做法应该是有错了就 raise Exception.
    Orenoid
        6
    Orenoid  
       Dec 4, 2019 via Android
    抛异常外层捕获呗,如果需要传递的信息很多的话,就自己构造一个异常类,根据需要定义属性。
    reus
        7
    reus  
       Dec 4, 2019
    不要用 1 2 3 这种 magic number
    imycc
        8
    imycc  
       Dec 4, 2019
    return status_code, user_instance

    这样虽然有点丑也不是不行。

    如果你的返回值足够复杂,可以考虑返回一个对象。比如你的返回信息里面包含了状态码,内容,计数器等多个内容,可以将结果封装一个 Result 类。

    至于要抛异常还是直接将错误放在返回信息里,我认为要根据函数的意义来定的。
    举个例子,使用 requests 库,获取一个不存在的资源,返回 404,不抛出异常;访问一个不存在的域名,抛出异常。因为对于一个 HTTP 库来说,域名不存在、网络不可达,是一种异常情况,而“404”属于 HTTP 定义的正常情况。
    具体怎么区分要根据实际场景来定了,我理解也不是很深,没法概括那么准确。
    frostming
        9
    frostming  
       Dec 4, 2019
    返回错误码一股子 C 味道,有错误抛异常才是 Python 的做法
    Hopetree
        10
    Hopetree  
       Dec 4, 2019
    我觉得 linux 的哲学很好,有报错就抛出,没有就什么也不显示
    wizardoz
        11
    wizardoz  
       Dec 4, 2019
    Exception 还不够你用?
    wizardoz
        12
    wizardoz  
       Dec 4, 2019
    @wizardoz 使用自定义的继承自 Exception 的异常类,你可以在里面带任何信息
    moonlitlaputa
        13
    moonlitlaputa  
       Dec 4, 2019 via Android
    构建一个异常类吧
    moonlitlaputa
        14
    moonlitlaputa  
       Dec 4, 2019 via Android
    自定义一个异常类
    janxin
        15
    janxin  
       Dec 4, 2019
    raise Exception
    SenLief
        16
    SenLief  
       Dec 4, 2019
    python 的做法是抛出异常吧,再带的不够那就用自定义,想返回啥返回啥。
    JCZ2MkKb5S8ZX9pq
        17
    JCZ2MkKb5S8ZX9pq  
       Dec 4, 2019
    看具体要求吧,我自己写了个 request 用的,就是也返异常(超时 /超重试次数 /返回码错误 /返回 json 解码错误 /等等),也返数据。
    但有些情况的确是直接抛异常更好。
    还有直接 log 出错记录,但不中断程序的情况。
    所以具体还是看场景吧。
    robot1
        18
    robot1  
       Dec 4, 2019
    python 的做法是抛出异常 可以自定义异常
    wangyzj
        19
    wangyzj  
       Dec 4, 2019
    感觉像是写 http 返回
    函数直接 raise 不就好了吗
    Hstar
        20
    Hstar  
       Dec 4, 2019
    比较 pythonic 的做法是外层 try...catch

    ``` python
    try:
    v = get_user()
    except MyException1:
    v = 1
    except MyException2:
    v = 2
    except Exception:
    v = None
    ```
    ech0x
        21
    ech0x  
       Dec 4, 2019 via iPhone
    这不就是 monad
    bxqqq
        22
    bxqqq  
       Dec 4, 2019
    参考 http response。
    virusdefender
        23
    virusdefender  
       Dec 4, 2019
    漏洞写 go 出身的吧 func a() (string, error)
    virusdefender
        24
    virusdefender  
       Dec 4, 2019
    楼主。。
    wzwwzw
        25
    wzwwzw  
       Dec 4, 2019
    一个函数应该返回固定的数据类型,否则调用会崩溃,失败可以返回 None,或者返回一个字典,也可以返回多个值,python 会变成元祖返回数据。
    ihipop
        26
    ihipop  
       Dec 4, 2019 via Android
    带数据的异常
    locoz
        27
    locoz  
       Dec 5, 2019
    换回 Go 就好了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3071 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 466ea39e · 75ms · UTC 14:15 · PVG 22:15 · LAX 07:15 · JFK 10:15
    ♥ Do have faith in what you're doing.