如果一个函数我都想返回一个 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 ![]() |