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 · 4115 次点击
    这是一个创建于 858 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    因为刚写 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   ·   实用小工具   ·   5659 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 06:29 · PVG 14:29 · LAX 22:29 · JFK 01:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.