pycharm 自动推断 typing - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
blankmiss
V2EX    Python

pycharm 自动推断 typing

  •  
  •   blankmiss 2022-07-17 23:17:07 +08:00 4567 次点击
    这是一个创建于 1183 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

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

    我是这么做的

    print(type(obj)) 

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

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

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

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

    第 1 条附言    2022-07-18 00:50:51 +08:00

    那也就是说,没有太好的解决方法咯,那实际开发中,如果碰到不熟悉的库,有什么方便开发的优解

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

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


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

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

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

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

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

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

    或者直接

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

    dir 函数会打印出类中所有的方法
    Syiize
        20
    Syiize  
       2022-07-18 18:07:46 +08:00 via Android
    pycharm 也可以跳转到类或者函数的定义那里,只需要把光标移到类名或者方法名那里,然后右键-->跳转-->声明或实例
    (如果我没记错的话)
    blankmiss
        21
    blankmiss  
    OP
       2022-07-18 22:50:17 +08:00
    @Syiize 如果是对象的话就没办法看对吧
    blankmiss
        22
    blankmiss  
    OP
       2022-07-18 22:50:47 +08:00
    @Syiize 感谢
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5837 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 03:24 PVG 11:24 LAX 20:24 JFK 23:24
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86