我目前使用的 Python 实时类型检查方案是在 Microsoft Python Extension for VS Code 中启用 mypy --strict 检查,但是发现这个方案存在一些瑕疵,比如将鼠标悬停在某个变量名上方时 VS Code 不能详细提示它的类型(它只会把 Dict[str, int] 类型提示为 dict 类型)。
我还尝试过 PyCharm ,不过不知道是因为 PyCharm 本身做不到还是我没找对门路,我一直没能将它设置为实时使用 mypy 检查。
我现在想知道:
大家是如何实时检查 Python 变量类型的?
Python 的类型检查体验真的没法达到 C++、C#、TypeScript 那样的程度吗?
回复前必读:
![]() | 1 expkzb 2019-09-20 17:27:01 +08:00 ![]() 变量名加类型后缀 |
![]() | 2 szzhiyang OP 我承诺向认真回帖的热心 V 友发送感谢! |
![]() | 3 star00 2019-09-20 17:29:12 +08:00 换语言 |
![]() | 4 shintendo 2019-09-20 17:30:06 +08:00 ![]() 匈牙利命名法! |
![]() | 7 ClericPy 2019-09-20 17:36:34 +08:00 ![]() Pydantic for the data parts. fastapi 里看到这个, 感觉还行, vscode 里开个 mypy 凑合用 |
![]() | 9 janxin 2019-09-20 17:42:14 +08:00 个看起来只是插件的问题,不过我试了一下我的插件的提示是正常的? |
![]() | 10 ClericPy 2019-09-20 17:43:51 +08:00 @szzhiyang 知道啊... 但是靠谱的试过都一般般啊, 之前最顺手是 pyright, 后来还是改回 mypy 了 |
![]() | 11 szzhiyang OP @janxin 请问你用的是什么编辑器的什么插件?它能提示 Dict[str, Set[int]] 这种复杂的类型吗? |
![]() | 13 iyaozhen 2019-09-20 17:46:56 +08:00 via Android 对楼主需求场景不太了解。 日常开发中也有类型检查的需求,不过仅仅是方便对象方法提示,一般是通过注释显式表明类型。因为 pycharm 的类型推导确实不太准 |
![]() | 14 SbloodyS 2019-09-20 17:50:05 +08:00 我用 typing.... |
![]() | 15 ClericPy 2019-09-20 17:51:23 +08:00 @szzhiyang 哈哈... 你能试的都试过了, 所以最好去 Reddit 上问... Pydantic 解决的是在 linter 里友好的显示类型, 你要的反而是个 linter... Pycharm 已经够高级了, 要啥自行车 |
16 pakro888 2019-09-20 18:16:14 +08:00 via Android 使用 pycharm 按住 ctrl 同时指针悬浮到变量上可以提示吧。 |
![]() | 17 janxin 2019-09-20 18:29:53 +08:00 跟你一样的插件,启用了 LSP。不过我只是看了一下同文件的,不同文件的没试过,理论上应该也差不多 |
![]() | 19 szzhiyang OP @ClericPy 很多非常明显的类型错误 PyCharm 都查不出来,比如下列代码: test_str: str = "Hello World" test_int: int = 123456 test_str += test_int 是因为我没设置好 PyCharm 吗? |
![]() | 20 clino 2019-09-20 18:44:48 +08:00 via Android 检查当然用 isinstance 啦 |
![]() | 23 lance6716 2019-09-20 21:59:53 +08:00 via Android 这种 pyobject 强行检查类型又有多大用途呢…不如理清楚写码思路 |
![]() | 28 szzhiyang OP @ClericPy 之前我一直以为用 PyCharm 写 Python 的体验就像用 Visual Studio 写 C# 那样,后来亲自尝试 PyCharm 后才发现我太天真了。 |
![]() | 30 ClericPy 2019-09-20 22:38:59 +08:00 @szzhiyang 我用过 Pycharm, 比你说的强太多了... 肯定也有插件什么的吧, 那么复杂一东西, 内存比 vscode 还少... 挺厉害了, 还是不会用 |
![]() | 31 /div> yegle 2019-09-21 03:53:46 +08:00 Python 的类型检查当然是垃圾啊。你来写一个类型注解,参数类型支持 iterable of strings 但是 exclude str type。 |
![]() | 33 a719114136 2019-09-21 11:26:19 +08:00 为啥要检查,又不能带来性能提升。 至于减少 bug,我写 py 这么久还真没见过因为这个造成的 bug (这种类型的 bug 在早期测试的时候完全能发现)。 最多也就是函数的参数,返回值用 Type Hints 给个类型提示,函数里面那想咋用就咋用呗 |
![]() | 34 szzhiyang OP @a719114136 类型检查还是很有必要的,不然 TypeScript 就不会问世了。 |
36 billlee 2019-09-21 15:23:15 +08:00 弃坑上车 java |
37 bakabie 2019-09-21 22:50:55 +08:00 弃坑上 Go ( |
![]() | 38 sazima 2019-09-22 07:53:45 +08:00 目前我也有点迷, 一般都是这么写 user: User = session.query(User).first() users: Sequence[User] = session.query(User).all() def get_user_by_id(use_id: int) -> User: .... |
39 laike9m 2019-09-22 10:26:32 +08:00 ![]() 试试 Google 的 pytype 呢? |
40 laike9m 2019-09-22 10:45:57 +08:00 @yegle 的确是个问题。没有 char 就算了这个不好改,但是我觉得 typing 应该加入 exclude types 支持。 |
41 laike9m 2019-09-22 11:04:01 +08:00 @yegle 我又想了一下,根源不是不支持 exclude,而是不支持 AND 条件。但是 typing 支持 Union,所以按照现在的设计应该写成 Union[List[str], Tuple[str], Set[str]]。从某种意义上说这样更明确。 |
![]() | 43 yegle 2019-09-28 03:28:07 +08:00 @laike9m 确实需要 exclude,或者正式支持 typing.Char 举个例子,你给的 Union 类型并不支持 typing.Iterable,不支持 typing.KeysView/typing.ItemsView/typing.ValuesView 这个是我几年前提的 FR:github.com/python/typing/issues/510 |