pycharm 自动推断 typing

2022-07-17 23:17:07 +08:00
 blankmiss

怎么进行高效代码智能提示、自动补全?

因为刚写 python ,所以我以为 python 在 pycharm 里能像 java 在 idea 里一样点击对象能进入源码去查看, 实例化对象以后能直接 通过对象名去点出 对象的具体方法和属性.

我然后发现这些好像都不能,于是搜了一些要满足上述操作

官方文档里找到了答案里面提到了 typing ,我于是去搜了一下 typing 是什么 在 python 3.5 里 支持这样

def greeting(name: str) -> str:
    return 'Hello ' + name

这有点像 java 的类名 对象名 一样

这样就解决了 自动提示 自动补全的功能

但是对于一个新手 或者一个开发者去使用一个新的类库的时候 肯定不能立马就知道一个对象里面有哪些属性和方法的(难道用一次就去文档查一次吗)

我是这么做的

print(type(obj))

去查看这个对象的类名 然后以 typing 的方式写好 可是这终究是很麻烦的 像 idea + java 可以很快的就知道

在这个帖子里/t/739664有提到

这是 python 这类动态类型语言的通病, ide 没法自动获取类型, 自然没有 java, c/c++之流的 ide 好用

所以我想问一下在两年后这个问题有没有得到改善 还是说我一开始就找错了方向

3844 次点击
所在节点    Python
22 条回复
dcsuibian
2022-07-17 23:43:19 +08:00
应该不会有什么大的进步,要代码提示的话上 Github Copilot 试试。
参考隔壁,有了 TypeScript 后,IDE 推导 JS 的能力就强了很多。但我感觉不会有 type python 这种东西。
disk
2022-07-17 23:57:45 +08:00
没法改善,没有类型,就无法推断,除非走其它路子比如像 Copilot 根据输入和上下文去预测。一般使用类库时,注意对函数参数和返回值的 type hint 补全后体验会好些,但有些库质量本身不好,就没办法了。
learningman
2022-07-18 00:02:59 +08:00
其实是可以的,你可以找你需要的对应的库的 type stub ,然后把那个 pyi 文件加入到 ide 的搜索目录里
learningman
2022-07-18 00:03:57 +08:00
但是 py 的 type hint 能力很弱,本身也只是作为一个注解,然后你经常会碰到上来一个 Any
Trim21
2022-07-18 00:05:42 +08:00
最高效的办法是去用那些已经写好了 typing 的类库()

不过实际情况是各种类库质量参差不齐,甚至有的开发者觉得写 typing 不“pythonic”而拒绝添加…
LeeReamond
2022-07-18 00:44:39 +08:00
jb 系的现在补全能力还是很强的,不过你追求的使用体验上,大概的问题是需要一个锚点,也就是上下文中至少标记一次类型。目前这个一般由基础库完成的,你使用的库比较老没有标记,所以 jb 无法自动完成类型推断。


@Trim21 感觉其实也可以理解,py 的卖点之一毕竟是接近自然语言水平的表达能力,加类型提示未必方便。不过我觉得如果向社区提供类库,那标记类型还是必要的习惯
blankmiss
2022-07-18 00:52:54 +08:00
@dcsuibian copilot 我感觉大部分时候提示的都有点问题
blankmiss
2022-07-18 00:53:28 +08:00
@learningman 有具体操作的例子或者文档吗
GeruzoniAnsasu
2022-07-18 02:11:19 +08:00
> 那也就是说,没有太好的解决方法咯,那实际开发中,如果碰到不熟悉的库,有什么方便开发的优解
没有。

有的库会提供 stub file 专门用来注解 type hint, 但基本还是只能翻文档
imycc
2022-07-18 04:20:31 +08:00
我不知道 pycharm 现在实现到啥程度了,说说 vsc 的情况。
假设你定义一个函数 foo ,返回值是一个确定的类型,比如 return Bar()这样,那么这个类型的推断是可以传递的,因此可以补全。把鼠标放到函数定义那里,应该是这样的形式 foo: () -> Bar 。

但 python 是不限制你返回值的类型的,你一会返回类型 A ,一会返回类型 B ,编辑器就无法推断你到底返回了啥,判断为 Any ,就没法补全了。
learningman
2022-07-18 07:38:45 +08:00
devcat9
2022-07-18 07:48:33 +08:00
我们组有接近十万行的 Python 3+ 代码,代码要求强制写 typing ,然后提示就很棒。
也不用 PyCharm ,直接 VSCode
Lattez
2022-07-18 09:21:29 +08:00
写 typing 后就很舒服,但是不知道有没有人遇到过 pycharm 用了 decorator 后 typing 就失效的问题,甚至连参数列表都打不出来了...
featureoverload
2022-07-18 09:38:15 +08:00
不用考虑太多;只是因为你是 Python 新手。

懂的都懂。
clf
2022-07-18 10:08:27 +08:00
可以说是像 kotlin 了,但 python 的缩进还是太让人难受了(
fgwmlhdkkkw
2022-07-18 10:19:39 +08:00
就算是 Java ,你用不熟悉的库的时候,就可以不看文档吗?
而且现在流行的 Python 库基本上都有 type hint 的。
blankmiss
2022-07-18 10:25:49 +08:00
@fgwmlhdkkkw 可以不需要,点进去看源码和注释
fgwmlhdkkkw
2022-07-18 11:53:22 +08:00
@blankmiss #17 现在大部分的 Python 库也可以点进去
Syiize
2022-07-18 18:06:09 +08:00
Python 的这个 typing 本来就只是一个单纯的类型提示作用,用来指定函数的参数类型和返回值类型比较方便,可以让 pycharm 提示你参数是否都带正确了。

想要知道一个类的具体方法最详细的就是去对应库的官方手册看,或者看类的 docstring:

'''
help(类) or help(类.方法)
'''

或者直接

'''
print(dir(类))
'''

dir 函数会打印出类中所有的方法
Syiize
2022-07-18 18:07:46 +08:00
pycharm 也可以跳转到类或者函数的定义那里,只需要把光标移到类名或者方法名那里,然后右键-->跳转-->声明或实例
(如果我没记错的话)

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

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

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

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

© 2021 V2EX