关于python有些内容不能自动补全有遇到过的吗?

大家有没有试过python 的补全: import matplotlib.pyplot as plt plt. 后面是会补全的。 但是你输入 fig = plt.figure() 后, 输入 fig. 就没有补全了,有办法让他补全吗?

试了一下不加括号能补, figure()是函数吧,真的还有后面么?

plt.figure() 能补,但是 fig.后面的就不能被。

关于python, 你用了哪些package呢?

唔……我的意思是,plt是class,figure()是plt的函数,所以调用的时候是plt.figure(),也就有补全

而fig = plt.figure() 之后,fig. 等于 plt.figure(). 函数后面是不像class可以带内置函数/变量的吧?

pyplot用的不多……本来fig.后面可以加什么呢?如果存在fig.xxx且可以运行的话,那确实是补全有问题,但我总觉得 fig.xxx本身就是语法错误呢……?

python水平不高,如有错误敬请谅解

这个在IPYTHON里面是没有问题的,能补全,但是在EMACS里面不能,感觉还是补全的问题。

我用的是spacemacs里面的python layer,所以package 很多,但主要是anaconda mode

我用了emacs+elpy,在org mode下做文学编程也有这个问题。 不过之前对python的这些库比较熟,就直接忽略了。而且大工程的时候还是用IDE 当然要能解决这个问题就更好了!

我用了ropemacs, 安装使用了El-get。不过现在也没能完成fig.后面的补全

所以不是emacs配置的问题,是本来就不能补全对象(类的实例)

我相信emacs可以做到,只是我还不会:slight_smile:

输完fig.按tab

100个补全项!

能麻烦您告诉我一下具体的配置好吗?我还是不行,在源代码里面没有补全,在命令行里面是没有问题的。

我并没有什么特别的配置,我就是重装了一下emacs, 而且才刚开始使用python layer,把自己以前python相关包都不要了。 我还以为是我之前没有发现呢,不过不知到你用没用到Yasnippet,我还重绑定了一下tab键

刚刚又试了一下,好像是要先运行了fig=plt.figure()后,才可以补全fig的。

刚刚试了一下,确实是不能补全, 不过这个可能是 jedi 的锅。

建议直接去 jedi 的 github 仓库报 issue。

这个是python等部分动态语言机制的问题,也是比较蛋疼的一点。

figure() 是实例,不能’点出来补全,其实你在ipython里也’点不出来的。 必须要把figure()实例化为一个对象,也就是fig才可以’点出来补全。

也就是说你在ipython里,直接写 fig = plt.figure(). 最后的’点也是’点不出来东西的。 只有你先执行了 fig = plt.figure(),才能在fig实例对象后’点出补全,因为ipython已经执行了实例化。 但是你在编辑器里只是写出来了代码,并没有执行。

说到底就是实例和实例对象的区别。

我觉得去jedi提issue也没有办法,因为要实现实时编译才行, 但这毕竟是个大工程,还要舍弃一定的灵活性(比如重新import 同一个文件)。

所以如果你要使用一些不熟悉的库,可以在emacs里开个ipython,来回切换,比如spc m s i && spc m s b。

ps. 我写大一点的项目,或者阅读别人源码的时候用J家的pycharm,毕竟功能强大,python亲和,便利的单步调试,还有动态的变量值展示。 刚才专门试了一下,pycharm是可以在实例上’点出来,毕竟pycharm实现了实时编译。如果有需求的话可以试一下pycharm。但是仅限于大型项目,写小脚本或经常写多语言什么的还是没有emacs灵活。

2 个赞

不过你倒是提醒了我,类必须实例化后才能补全,所以我使用的matploplib.pyplot 的类构造方法,也就是执行plt.Figure(), 注意是大写的,然后就可以补全了,所以看来机制本身没有问题,问题在于你对面向对象语言的理解。