Python 有必要自己写类型判断吗?

2020-03-15 16:50:36 +08:00
 onice

可能是因为我是从 Java 转 Python 的,我把 Python 当作是我的第二语言。

总所周知,Java 是强类型的语言,传参的时候类型错误编译是不会通过的。

为了让 Python 能像 Java 那样,我的想法是在方法开始的地方自己手动做类型判断。

类似这种:

def getHTML(url):
	if type(url) != str:
        raise TypeError("url 参数只能是字符串"")

这么做的目的是为了防止传入的参数类型不正确。但是转念一想,我在注释里面写明也可以,这么做有必要吗?

7939 次点击
所在节点    Python
77 条回复
weyou
2020-03-16 01:20:37 +08:00
这不是应该跟函数的用途有关么?一般写给别人用的接口函数要去 assert 检查下。自己用的内部函数为什么要检查?自己写的函数该提供什么类型的参数自己不知道么?当然在大型项目里你想让自己调试起来方便多加类型判断也是可以的。
charlie21
2020-03-16 01:38:05 +08:00
知道为什么企业级应用能用 java 就用 java 了吗?
yuchenyang1994
2020-03-16 01:50:23 +08:00
@love 运行时报错跟没报有什么区别,我就是要写鸭子类型呢?
xingheng
2020-03-16 03:21:16 +08:00
就楼主写的 sample function 而言,加或者不加类型判断都是合理的,调用出错了也不是这个方法本身的错,应该由调用方解决。
类型判断本身是有意义的,比如如果上面方法在实现的时候是接受 str 和 list/tuple 多种数据类型的时候,类型判断就变成了逻辑问题了。
xingheng
2020-03-16 03:30:11 +08:00
不过话说回来 type hint 还是有意义的,python 写多了自然会慢慢发现这个问题。
type hint 本身和类型检查不冲突,但是在使用 typing 或者没有用好 typing 的时候尝试类型检查一定是非常糟心的。
ManjusakaL
2020-03-16 03:46:52 +08:00
@janxin yeap 防御式编程非常重要,我只是吐槽一下把 type hint 和防御式编程等价的人。BTW runtime analysis 其实是一件吃力不讨好的事,无论是 typeguard 还是其余库,都避免不了用一些 magic lib 的使用,比如 inspect,比如 typeguard 其中还用到了一些 code frame 的操作,其实在线上一般不太会允许用这样的骚操作,因为对性能的损害太大,虽然 typeguard 有 import hook 可以做一些 inspect 的预处理&缓存的操作(其实就类似编译了)但是实际上在 runtime 还是有很多操作没法避免。。比如 typeguard 对 Collections 对象的 value type 的操作,一旦非 Any,就会遍历一次,进行 check。。在线上数据量很大的情况下。。这是炸锅的节奏😂
levelworm
2020-03-16 03:47:54 +08:00
type hint 我只是用来增加可读性,这玩意毕竟 Python 并不理睬。
levelworm
2020-03-16 03:49:42 +08:00
另外楼上有一点说的很对,type hint 对 ide 有帮助,这样自己写代码也快一些。
ManjusakaL
2020-03-16 04:05:53 +08:00
ManjusakaL
2020-03-16 04:31:38 +08:00
@love 如果说上面那个例子是测试结构本身的特性,不严谨的话,那么我肤浅的认为这个 https://github.com/pallets/werkzeug/blob/master/tests/test_routing.py#L802 更能算对输入类型做单测?要求传入 List,否则抛异常

Celery/Django 这样的例子还不少,要不我再去给大佬找几个来请大佬过过目,品一品,评一评?
ManjusakaL
2020-03-16 04:34:42 +08:00
jjx
2020-03-16 07:51:23 +08:00
type hint 很有意义

用过 typescript 就知道了

不过 python2 的坑 不容易出啊

不知道 python2 还会有更好的方案没有, 在注释中写 这个完全不是一回事情啊 感觉不对
Trim21
2020-03-16 07:52:58 +08:00
@jjx 是不是可以写 pyi…
benyur
2020-03-16 07:53:33 +08:00
我推荐一个思路,如果你是用 python3.5 以上版本,可以看看 pydantic 库,程序员只做类型声明,库帮你做类型检查,其实也是用了 python 的 type hint 特性。
janxin
2020-03-16 08:19:22 +08:00
@ManjusakaL 起床过于早了啊....

确实性能退化是最大的负面作用,选择需要根据具体的情况进行取舍
RHxW
2020-03-16 08:23:15 +08:00
@benyur
这个东西看起来好像很 6 哦~
lithiumii
2020-03-16 08:24:47 +08:00
py 的风格应该是要么不写要么 try except TypeError,要么你就全面 type hint
love
2020-03-16 10:09:40 +08:00
@ManjusakaL 你这些不都是业务要求类型检测?为啥不无脑对所有参数检测?你的意思不是要对所有参数检测吗?
SteveAlan
2020-03-16 10:19:21 +08:00
要不你去看看 py 一些比较出名的库?看看人家怎么做的
bnm965321
2020-03-16 10:20:30 +08:00
防御性编程是没错的,不过不是每个函数每个参数都要进行防御

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

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

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

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

© 2021 V2EX