为什么 Spyder 3.1 中的自动完成选项在编辑器中没有完全发挥作用?

Why autocompletion options in Spyder 3.1 are not fully working in the Editor?

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

所以这个问题有三个方面。首先,是否应该启用任何特定配置才能使其正常工作?我不这么认为,因为花了一些时间在谷歌上搜索,但只是想确定一下。其次,有人可以说明在自动完成方面什么有效,什么无效的官方说法是什么(例如,哪些特定模块在编辑器中有效,哪些无效?)。最后,编辑器和 Ipython 控制台在使用 Spyder 自动完成的性能方面有哪些技术方面的差异?我读了一些关于 Jedi vs. PsychoPy 模块的文章,所以很好奇(但是,请记住,虽然我有科学经验,但我对计算还比较陌生,所以对于受过教育但不是专家的人来说,请保持它相当简单)。

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

(这里是 Spyder 开发者)

我的答案:

is there any particular configuration that should be enabled to get this to work?

在 Spyder 3.1 中,我们添加了 numpydoc 库来改进某些对象(如 Matplotlib 图形和 NumPy 数组)的补全。如果 Dataframe 补全不适合你(它们适合我),请在 Github 上的问题跟踪器中打开一个问题来跟踪和解决这个问题。

could someone state what is the official word on what works and what doesn't in terms of autocompletion (e.g. what particular modules do work from the editor, and which ones doesn't?)

当对象是由 C/C++/Fortran 而不是 Python 中开发的函数或方法生成时,最困难的部分是完成定义。我的意思是,诸如

import numpy as np
a = np.array([])
a.<TAB>

正如我所说,这现在应该适用于数组、图形和数据框,但它不适用于所有库(大多数科学 Python 库是在 C/C++ 中创建的/Fortran 并包裹在 Python 中以提高速度)。

问题是我们使用的完成库(Rope 和 Jedi)不能很好地处理这种情况,因为 array(例如)不能以静态方式自省(即没有运行宁代码涉及它)。所以我们不得不求助于一些技巧,比如分析 array 的文档字符串来查看它的 return 类型并反省它。

what are the technical aspects of the differences between the editor and the Ipython console in the performance of the autocompletion with Spyder?

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

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

你会发现它不会 return你完成Da(当它显然应该return Dataframe).

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

dir(pd)

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

另一方面,Spyder 的编辑器没有 运行 代码的控制台,因此它必须通过代码中的 运行ning 静态分析工具(如 Jedi 和绳索)。正如我所说,他们会在没有 运行 的情况下检查您的代码。虽然它们对于纯 Python 代码工作得很好,但它们存在我上面针对编译库描述的问题。

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

  1. 不一定是一直有效的Python代码。例如,假设你在某处留下了一个未闭合的括号,但你想在其他地方完成。那应该没有问题吧?

  2. 它可能涉及非常昂贵的计算(例如,在 Dataframe 中加载巨大的 CSV),因此每次都对其进行评估以获得完成(这是必须的,因为每次询问时您的代码都不一样完成)可能会在眨眼间消耗掉你所有的内存。

it would be great to know why is the autocompletion better in Rodeo (another IDE)

我上次检查(几年前)时,Rodeo 评估了您的代码以获得补全。但是,我们会看看他们现在在做什么,看看我们是否可以改进我们的完工机制。

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

自动完成根本不适合我。 所以,我尝试了工具 -> 将 Spyder 重置为出厂默认设置,它成功了。