Python 函数同时返回错误值和数据怎么设计好 - V2EX
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 6614 次点击
    这是一个创建于 2141 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如果一个函数我都想返回一个 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     Solana     3298 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 93ms UTC 11:57 PVG 19:57 LAX 04:57 JFK 07:57
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86