首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
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
Coding
V2EX  ›  Python

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

  •  
  •   dearmymy · 9 天前 · 1842 次点击

    如果一个函数我都想返回一个 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
        1
    Leigg   9 天前 via Android
    一个函数,它的返回值的类型应该固定的。如果要满足你所说的需求,可以返回一个字典,如{return_code: "", value: ""}
        2
    aver4vex   9 天前
    返回元组或者字典
        3
    ClericPy   9 天前
    感觉像 golang 跑回来的, 但是 golang 返回的类型也是真 Error

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

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

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

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

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

    ``` python
    try:
    v = get_user()
    except MyException1:
    v = 1
    except MyException2:
    v = 2
    except Exception:
    v = None
    ```
        21
    ech0x   9 天前 via iPhone
    这不就是 monad
        22
    bxqqq   9 天前
    参考 http response。
        23
    virusdefender   9 天前
    漏洞写 go 出身的吧 func a() (string, error)
        24
    virusdefender   9 天前
    楼主。。
        25
    wzwwzw   8 天前
    一个函数应该返回固定的数据类型,否则调用会崩溃,失败可以返回 None,或者返回一个字典,也可以返回多个值,python 会变成元祖返回数据。
        26
    ihipop   8 天前 via Android
    带数据的异常
        27
    locoz   8 天前
    换回 Go 就好了
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3255 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 106ms · UTC 10:22 · PVG 18:22 · LAX 02:22 · JFK 05:22
    ♥ Do have faith in what you're doing.