为什么Spyder 3.1中的自动完成选项在编辑器中无法完全运行?

时间:2017-03-14 03:46:03

标签: python autocomplete spyder

在Mac Sierra上运行,Spyder(来自Anaconda发行版)的自动完成功能似乎非常不稳定。从Ipython控制台使用时,按预期工作。但是,当从编辑器中使用时(这是我的主要写作方式),是不稳定的。对于某些模块,例如pandas或matplotlib,自动完成工作(即,当按下TAB时会出现一个显示选项的小框)。所以写'pd。'然后点击TAB,按预期获得带有选项的框。但是,许多其他对象不会发生这种情况:例如,在定义名为“df”的数据框之后,键入“df”。 TAB什么都没显示。在Ipython控制台中,'df。' TAB将显示该数据帧的可用过程,例如groupby,以及它的列等。

所以问题是三重的。首先,是否有任何特定的配置应该启用以使其工作?我不这么认为,考虑到花时间谷歌搜索,但只是想确定。其次,有人可以说明在自动完成方面哪些有效,哪些无效的官方用语(例如哪些特定模块在编辑器中起作用,哪些不起作用?)。最后,编辑器和Ipython控制台在与Spyder实现自动完成功能方面存在差异的技术方面是什么?我读了一些关于Jedi vs. PsychoPy模块的内容,所以很好奇(但是请记住,虽然我有科学经验,但我对计算相对较新,所以对于受过教育但不是专家的人来说,请保持相当简单。)< / p>

更新:作为一个附带问题,很高兴知道为什么Rodeo(另一个IDE)中的自动完成功能更好。它更新,总体选项比Spyder少,但自动完成功能在编辑器中完美运行。

3 个答案:

答案 0 :(得分:10)

Spyder开发者

我的回答:

  

是否应该启用任何特定配置才能使其生效?

在Spyder 3.1中,我们添加了numpydoc库来改进某些对象的完成(如Matplotlib数字和NumPy数组)。如果Dataframe完成对您不起作用(它们适用于我),请在Github上的问题跟踪器中打开一个问题来跟踪并解决此问题。

  

有人可以说明在自动完成方面哪些有效,哪些无效的官方用语(例如哪些特定模块可以在编辑器中起作用,哪些不起作用?)

最困难的部分是在通过C / C ++ / Fortran而不是Python开发的函数或方法生成对象时完成定义的完成。我的意思是,像

这样的事情
import numpy as np
a = np.array([])
a.<TAB>

正如我所说,现在应该对数组,数字和数据帧起作用,但它并不适用于所有库(大多数科学Python库都是用C / C ++ / Fortran创建的,并且用Python包装以提高速度)。

问题是我们使用的完成库(Rope和Jedi)无法很好地处理这种情况,因为array(例如)无法以静态方式进行内省(即没有运行代码涉及它)。因此,我们必须采用分析array的docstring等技巧来查看其返回类型,并反省内省。

  

在使用Spyder进行自动完成时,编辑器和Ipython控制台之间的差异有哪些技术方面?

最重要的区别是,在IPython控制台中,您必须运行您的代码才能完成相关操作。例如,请在新的IPython控制台中运行它

In [1]: import pandas as pd
   ...: df = pd.Da<Tab>

你会看到不会返回Da的任何完成次数(显然应该返回Dataframe)。

但是,经过评估,获得完成非常简单。你可以简单地运行

dir(pd)

得到它们(这就是IPython本质上在内部所做的)。

另一方面,Spyder的编辑器没有运行代码的控制台,因此必须通过在代码中运行静态分析工具(如Jedi和Rope)来完成。正如我所说,他们在不运行代码的情况下反省代码。虽然它们非常适用于纯Python代码,但它们存在我上面针对编译库所描述的问题。

尝试评估编辑器中的代码以获得完成通常不是一个好主意,因为:

  1. 它不一定是有效的Python代码。例如,假设您在某处留下了一个未闭合的括号,但您希望在某个其他位置获得完成。这应该没有问题,对吗?

  2. 这可能涉及非常昂贵的计算(例如,在Dataframe中加载一个巨大的CSV),因此每次都要对其进行评估以获得完成(这是必须的,因为每次要求完成时代码都不同)消耗掉你所有的RAM。

  3.   

    很高兴知道为什么Rodeo(另一个IDE)中的自动完成性更好

    上次我检查(几年前),Rodeo评估了您的代码以获得完成。但是,我们现在要看看他们现在正在做什么,看看我们是否可以改进我们的完井机械。

答案 1 :(得分:4)

如果项目工作目录路径中没有空格,则自动完成功能正常。

答案 2 :(得分:2)

自动完成功能对我来说根本不起作用。 所以,我尝试了工具 - &gt;将Sypder重置为出厂默认值并且有效。