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

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

7914 次点击
所在节点    Python
77 条回复
love
2020-03-15 19:53:13 +08:00
@yuchenyang1994 你是来搞笑吗,你的意思是动态类型语言的单元测试还要测试错误的类型输入?哪个项目这么干我去膜拜一下
jin7
2020-03-15 20:19:20 +08:00
就写个脚本 不用这个复杂....
UnknownR
2020-03-15 20:23:29 +08:00
用 c#,但是理念差不多,try catch 一把梭,报错了再说

要么直接类型转换,转不了再抛出,要么在关键的位置做判断,其他地方等异常抛出了再处理
pabupa
2020-03-15 20:47:08 +08:00
你不加类型断言,它后面还是会报错的呀……
Applenice
2020-03-15 20:55:36 +08:00
keepeye
2020-03-15 21:04:15 +08:00
如果方法是给别人用,那么 1 是要加 type hints,2 是要做必要的类型检测。
自己用的话加个 type hints 就行了,不会明知故犯
yonoho
2020-03-15 21:23:40 +08:00
我们组现在 CR 就强制要求写 type hint。对我们有用吗?有用。对于调用方更易读,对于提供方也迫使他写之前先想清楚,低级错误会少一些。type hint 和 注释的区别在于它的规范性,更容易被支持。比如 Pycharm 就支持这种静态分析,我想也应该有一些好的库可以基于 type hint 实现你的这种需求,只要套一个装饰器就可以了。
noparking188
2020-03-15 21:43:17 +08:00
必要时候我会用 isinstance 类型检查,针对可以设想到的错误场景,大部分时候是不做类型判断的,感觉那太蠢了,多了很多无多大意义的代码,我是做数据开发的,主要处理各种数据,用 py2
之前看了下 fastapi,它用了 pydantic,觉得挺新奇的,比较有意思,不过若是开发有点规模的 web 后台服务,我会选择 java/scala, 虽然我以前上学和实习时候都是用 python 的 flask 框架
个人觉得 type hints 一定程度上可以帮助阅读代码,写的话会带来一些困扰,既然要写明类型,那为什么还要用 Python 呢,或许绝大部分时候并不需要这个特性
个人觉得最好的方式还是协定好开发规范,规范、详细的注释和文档真的很有帮助
一点愚见
noparking188
2020-03-15 21:51:38 +08:00
def getHTML(url):
""" fetch html page

:param url:
:type url: str
"""

让它报错,除非你不想这个异常被抛出而中断程序,那么请提前处理
lithbitren
2020-03-15 22:00:52 +08:00
type hints + mypy 可以在运行前解决绝大部分类型问题,这几年 TypeScript 火起来了,Python 也受到了不少影响,不过个人而言还是反对的,类型语言多的是,写 Python 还搞类型就是脱裤子放屁,一点都不 pythonic。
sepld
2020-03-15 22:04:45 +08:00
可以使用装饰器,定义下接收参数的类型, 提前处理掉
cmdOptionKana
2020-03-15 22:09:24 +08:00
如果必须写 type hint, 那么为啥要用动态类型语言,动态语言被发明出来不就是为了不把类型写死,从而获得一定程度上的便利吗
zzj0311
2020-03-15 22:25:10 +08:00
和主流程无关的代码尽量抽离,为了编辑器提示写类型标注就够了
vicalloy
2020-03-15 23:28:22 +08:00
没想到这么多人反对 type hint。
在我看来,对于常用的库 type hint 肯定是趋势。有类型注解,文档都可以少翻很多。
虽然我懒,一般不注明类型,但有时候为了让 ide 的自动补全可以出来也会主动的加上类型注解。
fy
2020-03-15 23:48:23 +08:00
type hint 很有用啊,这玩意是给 IDE 看的呀!
pcbl
2020-03-15 23:52:49 +08:00
没有什么事 try except 解决不了的,如果解决不了,那一定是你 try 的不够多(楼上头像)
zhidian
2020-03-16 00:15:33 +08:00
type hint 可以让你的 IDE 给你更好的自动补全.
freakxx
2020-03-16 00:37:29 +08:00
或者你从一个比较高的角度去考虑这个事情,

假如你接受的参数是来自外部或者你必须做强校验,那么你有 2 种更好的选择

- 从 form 或者 serializer 就定义好字段类型
- 自己做一个 validator

这两种做法的好处是,不会让 所谓 “类型”检验的代码散落到处都是
freakxx
2020-03-16 00:39:44 +08:00
get_html(url)

这个函数在使用上就默认 url 是一个 str 就好,需要做 validate 之类的话,更有意义是检测它是否是一个完整的 http 链接
gjquoiai
2020-03-16 01:04:35 +08:00
想写自然可以写,不写也没人逼你写_(:з)∠)_ 突出一个自由。。
不过我觉得你需要的是 serializer/validator 这种东西

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

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

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

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

© 2021 V2EX