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

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

7887 次点击
所在节点    Python
77 条回复
JCZ2MkKb5S8ZX9pq
2020-03-15 16:55:32 +08:00
可以了解下 assert,不过大多数情况下我是不写的。
westoy
2020-03-15 17:03:31 +08:00
3.5 开始就有 type hints 了啊

@JCZ2MkKb5S8ZX9pq assert 语法在 python -O 的时候会跳过的, 不是运行时判断的
widewing
2020-03-15 17:10:26 +08:00
def getHTML(url:str):
blahblah
imn1
2020-03-15 17:16:03 +08:00
按易入难出原则的话,是要写的
但如果都商量好了格式,或者 API 固定,就没必要了
vicalloy
2020-03-15 17:21:59 +08:00
这样做只有运行时才会报错。如果是运行时报错,这个提示不会比不做类型检查的报错清楚多少。
python 3.5 开始支持 type hints,之前的版本也有相应的库支持类似 type hints 的检查。
这样做完全没有必要。
PTLin
2020-03-15 17:26:35 +08:00
真在意类型的话可以用装饰器来实现参数类型的校验,而且 Python 是动态强类型语言。
https://paste.ubuntu.com/p/RSWXVt5pZP/
wuwukai007
2020-03-15 17:27:07 +08:00
写只是为了方便维护,仅此而已。
cmdOptionKana
2020-03-15 17:27:37 +08:00
既然用了 python,建议尽量先习惯一下动态语言的思维方式,曾经盛极一时的 python2 也没有 type hint,照样能干活。

不然多学一门语言有啥意义呢。

(另外你用 type hint, 但你看别人的代码多数没有 type hint, 总的来说还是要转变思维的)
ClericPy
2020-03-15 17:46:00 +08:00
type hints 配合 mypy, 代码没执行就看到一大堆错误类型的报错

type hints 配合 pydantic, 类型不对的会尝试转换, 转换失败会报错, 类似于 var: int = '123' => 123, path: Path = '/' => Path('/')
zhengxiaowai
2020-03-15 17:46:52 +08:00
编程理念不同而已,常见的做法有三种

1、利用异常机制自己在错误时候抛出异常,这时候抛出的异常的函数往往不是传入的那个函数,会导致排查困难
2、防御式编程如果你描述的那样,这样代码写的多能够及时发现,排查简单
3、type hint 这个会的不多,写好的更少,依赖工具检查需要高版本 python

从开源项目来看 方式 2 用的比较多,方式 3 是趋势
ManjusakaL
2020-03-15 18:06:51 +08:00
一大堆推荐用 type hint 的,我简直乐的不行

1. Type Hint 3.5 之后的特性,现在还有很多公司的 codebase 在 2.7 吧?拿头用 PEP484 ? 写注释? backport 只支持了基本类型

2. Type Hint 的生效,极其依赖 CI 流程,你不用 mypy 之类的工具,直接暴力上线,有蛋用。。。人家是 static analysis 而不是 runtime analysis

3. 关键位置做防御式编程,是个很好的习惯
ipwx
2020-03-15 18:17:46 +08:00
看情况吧。不过很多一般省去类别检查,就当它是 str 或者 str-like。或者直接 url = str(url)。
szbzhao
2020-03-15 18:24:25 +08:00
你不要理这些,先把任务完成!
janxin
2020-03-15 18:46:03 +08:00
@ManjusakaL 虽然是这么说,但是也要看每个公司的情况,我猜很多用 py2 的大概后面都要换到 Java/Go 去了吧...

另外借助运行时装饰器也是可以实现 runtime checker 功能的,比如 typeguard 之类的工具可以实现这样的功能。当然这种方案也有负面作用,借助 mypy 这类的工具也不是没价值,不过属于额外基础设施方案。

防御编程十分有必要,无论是否是强类型语言,都需要做。
iConnect
2020-03-15 18:55:29 +08:00
@ipwx #12 楼的方式值得推荐,关键位置预防一下即可。
love
2020-03-15 19:09:22 +08:00
那用动态语言又是何必呢
我记得在哪看的 js 最佳实践是不建议写参数类型判断的
janxin
2020-03-15 19:11:08 +08:00
@love 还有这种实践?我读书少你别骗我
shijingshijing
2020-03-15 19:15:32 +08:00
这是 python 的 feature,你这样写就不够 pythonic 了
love
2020-03-15 19:51:00 +08:00
@janxin 你去看流行的 js 开源代码,没有人会检查参数类型错误。真要检查类型错误上 typescript
yuchenyang1994
2020-03-15 19:51:07 +08:00
我看到这些推荐用 type hint 的,我也乐的不行
1. type hint != 类型检查
2. type hint 是自己骗自己,没有编译时的语言,一切类型标注都是自己骗自己,是耍流氓
3. 该写单测写单测

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

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

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

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

© 2021 V2EX