首页   注册   登录
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
dearmymy
V2EX  ›  Python

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

  •  
  •   dearmymy · 53 天前 · 2356 次点击
    这是一个创建于 53 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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