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

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

    因为刚写 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 条附言  ·  133 天前

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

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

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


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

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

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

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

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

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

    或者直接

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

    dir 函数会打印出类中所有的方法
    Syiize
        20
    Syiize  
       133 天前 via Android
    pycharm 也可以跳转到类或者函数的定义那里,只需要把光标移到类名或者方法名那里,然后右键-->跳转-->声明或实例
    (如果我没记错的话)
    blankmiss
        21
    blankmiss  
    OP
       133 天前
    @Syiize 如果是对象的话就没办法看对吧
    blankmiss
        22
    blankmiss  
    OP
       133 天前
    @Syiize 感谢
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3103 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 44ms · UTC 15:31 · PVG 23:31 · LAX 07:31 · JFK 10:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.