V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
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 · 2019-12-03 22:59:58 +08:00 · 6185 次点击
    这是一个创建于 1850 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

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

    ``` python
    try:
    v = get_user()
    except MyException1:
    v = 1
    except MyException2:
    v = 2
    except Exception:
    v = None
    ```
    ech0x
        21
    ech0x  
       2019-12-04 15:00:14 +08:00 via iPhone
    这不就是 monad
    bxqqq
        22
    bxqqq  
       2019-12-04 15:40:06 +08:00
    参考 http response。
    virusdefender
        23
    virusdefender  
       2019-12-04 15:41:16 +08:00
    漏洞写 go 出身的吧 func a() (string, error)
    virusdefender
        24
    virusdefender  
       2019-12-04 15:41:24 +08:00
    楼主。。
    wzwwzw
        25
    wzwwzw  
       2019-12-04 19:37:16 +08:00
    一个函数应该返回固定的数据类型,否则调用会崩溃,失败可以返回 None,或者返回一个字典,也可以返回多个值,python 会变成元祖返回数据。
    ihipop
        26
    ihipop  
       2019-12-04 21:36:08 +08:00 via Android
    带数据的异常
    locoz
        27
    locoz  
       2019-12-05 10:39:49 +08:00
    换回 Go 就好了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2109 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 16:13 · PVG 00:13 · LAX 08:13 · JFK 11:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.