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

2019-12-03 22:59:58 +08:00
 dearmymy

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

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

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

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

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

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

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

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/625683

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX