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 参数只能是字符串"")

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

8297 次点击
所在节点    Python
77 条回复
vkhsyj
2020-03-16 10:23:20 +08:00
可以用 type hint
iceking
2020-03-16 10:23:40 +08:00
有些场景要做,比如在向 mongo 塞数据时,类型错误就有脏数据了,当然也可以借助 odm 来处理。有的地方你不做,等着程序自己报错,外面捕获也行。要自己定义错误,就自己抛。
ManjusakaL
2020-03-16 10:35:55 +08:00
@love 大佬你之前可不是这么说的噢

> 你是来搞笑吗,你的意思是动态类型语言的单元测试还要测试错误的类型输入?哪个项目这么干我去膜拜一下

这不给你找了几个项目嘛
Torpedo
2020-03-16 11:13:15 +08:00
还是一定程度上有必要的。特别是你写一个大家都用的模块。传参检测可以防止人家传错误的参数。虽然运行时,至少调试的时候运行到这里可以看到。
tobeyouth
2020-03-16 11:48:24 +08:00
比较复杂的类型建议写上 hints,如果还在 2.7,我觉得注释或通过 schema 验证可能算是个解决方法。
否则,一个嵌套多层的 dict / list,真的太崩溃了。
oahebky
2020-03-16 11:52:45 +08:00
按自己倾向写或者不写。
等你 Python 代码写多了,自然能得到一个到底写还是不写的准确结论。
如果你 python 代码一直没怎么写,那么也不需要去硬遵守应该写或者不写的结论。

因为这个东西无关紧要。有个一年多经常写 Python 代码的人(写的很多的前提下),便可以在需要的地方写,不需要的地方不写。
大多数情况下是不需要写的,当你不确定需不需要写的时候也是不用写的。
TestOpsJarstick
2020-03-16 12:01:35 +08:00
个人觉得得看你得代码主要出路啥业务吧 ,比如你要写一个递归解析多层混合类型 json 数据,一般只有在 debug 的时候才会使用 type() 用得最多的还是 isinstance()
siteshen
2020-03-16 12:10:14 +08:00
@ManjusakaL
1. 坚持用 python 2.x 的用户不是 type hint 的目标用户;
2. type hint 如果是程序员主动发起的话,肯定是会配置一些基础的检查的;
3. type hint 不是万能的,static analysis 比 no analysis 还是好了不少的,最不济还能当个注释,让 ide 能智能补全。
siteshen
2020-03-16 12:12:19 +08:00
@janxin 可能真的有这种最佳实践,毕竟动态类型语言的优势在于 duck type,即使要判断也应该是判断参数是否实现对应的接口,而不是要求参数是指定的类型。
ManjusakaL
2020-03-16 12:30:51 +08:00
@siteshen yeap,但是我驳斥的是把 type hint 和防御式编程等价的
pythonee
2020-03-16 15:03:01 +08:00
这个问题每隔一段时间都会问自己吧,就好像选择红药丸和蓝药丸一样
静态语言和动态语言的纠结,写静态语言总是让人更安心些
wzwwzw
2020-03-16 15:11:37 +08:00
在需要的时候写,在不需要的时候不写,如果你不知道这里是不是改写,那就是要写。isinstance 可能是更好的方式。或者使用 pydantic + mypy。
Qzier
2020-03-16 15:16:47 +08:00
具体看需求
fhsan
2020-03-16 15:34:45 +08:00
26.1. typing — Support for type hints
janxin
2020-03-16 16:01:10 +08:00
@siteshen duck type 在类型标注里也有对应的啊...
lewinlan
2020-03-16 23:40:47 +08:00
assert+isinstance,最标准用法。再考虑加函数参数和返回值类型
hushao
2020-04-09 18:15:04 +08:00
即使需要判断也不建议 type,正确的应该用 isinstance

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

https://tanronggui.xyz/t/653005

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

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

© 2021 V2EX