【问题标题】:Why autocompletion options in Spyder 3.1 are not fully working in the Editor?为什么 Spyder 3.1 中的自动完成选项不能在编辑器中完全运行?
【发布时间】:2018-05-26 03:43:20
【问题描述】:

在 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 更新,整体选项更少,但自动完成功能在编辑器中完美运行。

【问题讨论】:

    标签: python autocomplete spyder


    【解决方案1】:

    这里是 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 包装以提高速度)。

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

    编辑器和 Ipython 控制台在使用 Spyder 的自动补全性能方面有哪些技术差异?

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

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

    您会看到它不会返回您对 Da 的任何完成(当它显然应该返回 Dataframe 时)。

    但是,在评估之后,获得完成是非常简单的。你可以简单地运行

    dir(pd)
    

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

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

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

    1. 不一定总是有效的 Python 代码。例如,假设您在某处留下了一个未闭合的括号,但您想在其他地方获得补全。这应该没有问题,对吧?

    2. 1234563瞬间消耗掉你所有的内存。

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

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

    【讨论】:

    • 男孩,这是我在 Stackoverflow 中写的最长的答案!我会用它作为这个主题的参考,因为它在我们(沮丧的)用户中出现了很多:)
    • 确实是一个伟大而全面的答案。非常感谢卡洛斯。还有一件事:您能否确认这是否在 Spyder 的优先级列表中排名靠前?关于 Rodeo,上周末我彻底检查了这两个 IDE,我不得不说它们的自动补全功能非常好和高效。你介意更新一次(如果)你检查他们在做什么吗?很高兴知道是否可以在 Spyder 上进行改进,或者它是否绝对是一个核心的、无法修复的问题。谢谢你!
    • 如果我们可以通过研究 Rodeo 的代码来改进事情,我会回来找你的。我们还有其他想法来改善这种情况。我可以保证这对我们来说是一个重要的问题,我们已经竭尽全力改进 Jedi 和 Rope 默认提供的功能。问题是这是一个非常棘手的问题,Spyder 还有很多其他需要注意的事情(调试可能是最重要的事情),所以我们需要一些时间才能达到完美完成的地步。
    • Carlos,只是为了确保在错误报告中:您提到自动补全应该对 pandas 正常工作。创建一些变量(例如,名为 'my_data' 的标准 DataFrame ),在编辑器中键入 'my_' 按预期正常完成到 'my_data' ,但随后 'my_data.' 什么都不做。但是,直接在 Ipython 控制台中,后者确实显示了所有建议(例如 .data.. 这是提交报告的错误行为吗?
    • 我还注意到 Rodeo 中的一个很酷的功能:如上例所示,假设“my_data”有一个名为“foo”的列。正如预期的那样,“my_data.f”将显示选项(以及一个包含对象文档的酷框)。但令人印象深刻的是,"my_data['f" 甚至 'my_data[' 将显示对 'my_data['foo']' 的建议。我想 Rodeo 和 Spyder 之间肯定存在一些核心差异。关于允许这种行为的任何线索或预感?
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      自动完成对我根本不起作用。 所以,我尝试了工具 -> 将 Sypder 重置为出厂默认设置,它成功了。

      【讨论】:

      • 也为我工作!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-20
      • 2012-08-22
      • 1970-01-01
      相关资源
      最近更新 更多