如果一个函数我都想返回一个 int 作为结果判断,比如 0 为成功,1,2,3 为其他错误值,同时也要返回函数数据,比较好的设计是什么样的。 def getUeser(): if xxx: return 1,None if xxx: return 2,None return 0,user 这样返回好像不是特别好么?
看文章有的说是用抛异常? python 小白求教
1
Leigg 2019-12-03 23:33:31 +08:00 via Android
一个函数,它的返回值的类型应该固定的。如果要满足你所说的需求,可以返回一个字典,如{return_code: "", value: ""}
|
2
aver4vex 2019-12-03 23:36:07 +08:00
返回元组或者字典
|
3
ClericPy 2019-12-03 23:41:47 +08:00
感觉像 golang 跑回来的, 但是 golang 返回的类型也是真 Error
自己 try 住在 final 里 return ? 如果每个函数都要, 用装饰器是可以很容易装饰好的, 毕竟 python magic 太足了, 也符合装饰器模式, 对原始函数直接套, 和 golang 就很接近了 最后判断错误只要 err 不是 None 就说明有错误了呗 |
4
levelworm 2019-12-03 23:44:26 +08:00
抛异常我觉得也蛮好的,至少比返回 tuple 感觉舒服一些。
|
5
superrichman 2019-12-03 23:49:27 +08:00
要我自己临时写我会返回一个 tuple, 但是更 pythonic 的做法应该是有错了就 raise Exception.
|
6
Orenoid 2019-12-04 00:02:24 +08:00 via Android
抛异常外层捕获呗,如果需要传递的信息很多的话,就自己构造一个异常类,根据需要定义属性。
|
7
reus 2019-12-04 00:09:24 +08:00
不要用 1 2 3 这种 magic number
|
8
imycc 2019-12-04 02:13:14 +08:00
return status_code, user_instance
这样虽然有点丑也不是不行。 如果你的返回值足够复杂,可以考虑返回一个对象。比如你的返回信息里面包含了状态码,内容,计数器等多个内容,可以将结果封装一个 Result 类。 至于要抛异常还是直接将错误放在返回信息里,我认为要根据函数的意义来定的。 举个例子,使用 requests 库,获取一个不存在的资源,返回 404,不抛出异常;访问一个不存在的域名,抛出异常。因为对于一个 HTTP 库来说,域名不存在、网络不可达,是一种异常情况,而“404”属于 HTTP 定义的正常情况。 具体怎么区分要根据实际场景来定了,我理解也不是很深,没法概括那么准确。 |
9
frostming 2019-12-04 09:22:39 +08:00
返回错误码一股子 C 味道,有错误抛异常才是 Python 的做法
|
10
Hopetree 2019-12-04 09:57:43 +08:00
我觉得 linux 的哲学很好,有报错就抛出,没有就什么也不显示
|
11
wizardoz 2019-12-04 10:13:40 +08:00
Exception 还不够你用?
|
13
moonlitlaputa 2019-12-04 10:27:13 +08:00 via Android
构建一个异常类吧
|
14
moonlitlaputa 2019-12-04 10:27:35 +08:00 via Android
自定义一个异常类
|
15
janxin 2019-12-04 10:53:31 +08:00
raise Exception
|
16
SenLief 2019-12-04 11:49:01 +08:00
python 的做法是抛出异常吧,再带的不够那就用自定义,想返回啥返回啥。
|
17
JCZ2MkKb5S8ZX9pq 2019-12-04 12:02:59 +08:00
看具体要求吧,我自己写了个 request 用的,就是也返异常(超时 /超重试次数 /返回码错误 /返回 json 解码错误 /等等),也返数据。
但有些情况的确是直接抛异常更好。 还有直接 log 出错记录,但不中断程序的情况。 所以具体还是看场景吧。 |
18
robot1 2019-12-04 14:01:26 +08:00
python 的做法是抛出异常 可以自定义异常
|
19
wangyzj 2019-12-04 14:42:33 +08:00
感觉像是写 http 返回
函数直接 raise 不就好了吗 |
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 ``` |
21
ech0x 2019-12-04 15:00:14 +08:00 via iPhone
这不就是 monad
|
22
bxqqq 2019-12-04 15:40:06 +08:00
参考 http response。
|
23
virusdefender 2019-12-04 15:41:16 +08:00
漏洞写 go 出身的吧 func a() (string, error)
|
24
virusdefender 2019-12-04 15:41:24 +08:00
楼主。。
|
25
wzwwzw 2019-12-04 19:37:16 +08:00
一个函数应该返回固定的数据类型,否则调用会崩溃,失败可以返回 None,或者返回一个字典,也可以返回多个值,python 会变成元祖返回数据。
|
26
ihipop 2019-12-04 21:36:08 +08:00 via Android
带数据的异常
|
27
locoz 2019-12-05 10:39:49 +08:00
换回 Go 就好了
|