web-dev-qa-db-fra.com

Pourquoi les options d'auto-complétion dans Spyder 3.1 ne fonctionnent-elles pas complètement dans l'éditeur?

Sous Mac Sierra, l'auto-complétion dans Spyder (de la distribution Anaconda) semble assez erratique. Lorsqu'il est utilisé à partir de la console Ipython, fonctionne comme prévu. Cependant, lorsqu'il est utilisé depuis l'éditeur (ce qui est ma principale écriture), il est erratique. L’auto-complétion fonctionne (c’est-à-dire que lorsque vous appuyez sur la touche TAB, une petite boîte apparaît avec les options disponibles) pour certains modules, tels que les pandas ou matplotlib. Donc, écrit «pd». et en appuyant sur TAB, obtient la boîte avec des options comme prévu. Cependant, cela ne se produit pas avec de nombreux autres objets: par exemple, après avoir défini un cadre de données nommé "df", saisissez "df". TAB ne montre rien. Dans la console Ipython, «df». La TAB afficherait les procédures disponibles pour cette image, telles que groupby, ainsi que ses colonnes, etc.

La question est donc triple. Premièrement, y a-t-il une configuration particulière qui devrait être activée pour que cela fonctionne? Je ne pense pas, étant donné le temps passé à googler, mais je veux juste m'en assurer. Deuxièmement, quelqu'un pourrait-il indiquer quel est le mot officiel sur ce qui fonctionne et ce qui ne fonctionne pas en termes de complétion automatique (par exemple, quels modules particuliers fonctionnent sous l'éditeur et lesquels ne fonctionnent pas?). Enfin, quels sont les aspects techniques des différences entre l'éditeur et la console Ipython lors de l'exécution de l'auto-complétion avec Spyder? J'ai lu quelque chose à propos des modules Jedi vs PsychoPy, alors je suis devenu curieux (cependant, gardez à l'esprit que même si j'ai une expérience scientifique, je suis relativement nouveau en calcul, donc restez assez simple pour une personne instruite mais non experte).

MISE À JOUR: En tant que question secondaire, il serait bon de savoir pourquoi l'auto-complétion est meilleure dans Rodeo (un autre IDE). C'est plus nouveau, a beaucoup moins d'options globales que Spyder, mais l'auto-complétion fonctionne parfaitement dans l'éditeur.

8
Alejandro

(Développeur Spyder ici)

Mes réponses:

y a-t-il une configuration particulière qui devrait être activée pour que cela fonctionne?

Dans Spyder 3.1, nous avons ajouté la bibliothèque numpydoc pour améliorer la complétion de certains objets (comme les figures Matplotlib et les tableaux NumPy). Si les finitions Dataframe ne fonctionnent pas pour vous (elles le sont pour moi), veuillez ouvrir un problème dans notre outil de suivi des problèmes sur Github pour suivre et résoudre ce problème.

quelqu'un pourrait-il indiquer quel est le mot officiel sur ce qui fonctionne et ce qui ne fonctionne pas en termes de complétion automatique (par exemple, quels modules particuliers fonctionnent sous l'éditeur et lesquels ne fonctionnent pas?)

La partie la plus difficile consiste à obtenir la finalisation des définitions lorsqu'un objet est généré par des fonctions ou des méthodes développées en C/C++/Fortran et non en Python. Je veux dire des choses comme

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

Comme je l'ai dit, cela devrait fonctionner maintenant pour les tableaux, les figures et les cadres de données, mais cela ne fonctionne pas pour toutes les bibliothèques (et la plupart des bibliothèques scientifiques Python sont créées en C/C++/Fortran et enveloppées dans Python pour plus de rapidité).

Le problème est que les bibliothèques de complétion que nous utilisons (Rope et Jedi) ne peuvent pas traiter ce cas très bien car array (par exemple) ne peut pas être introspecté de manière statique (c'est-à-dire sans exécuter de code le impliquant). Nous devons donc recourir à des astuces telles que l'analyse de la docstring de array pour voir son type de retour et l'introspection à la place.

quels sont les aspects techniques des différences entre l'éditeur et la console Ipython lors de l'exécution de l'auto-complétion avec Spyder?

La différence la plus importante est que dans la console IPython vous devez exécuter votre code avant d’avoir des informations complètes à ce sujet. Par exemple, veuillez l’exécuter dans une nouvelle console IPython.

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

et vous verrez qu'il ne veut pas ne vous retournera aucune complétion pour Da (alors qu'il devrait évidemment retourner Dataframe).

Mais, après évaluation, il est assez simple d’obtenir des compléments. Vous pouvez simplement courir

dir(pd)

pour les obtenir (c’est ce que fait essentiellement IPython en interne).

Spyder's Editor, quant à lui, ne dispose pas de console pour exécuter du code. Il doit donc être complété en exécutant des outils d’analyse statique dans votre code (comme Jedi et Rope). Comme je l'ai dit, ils introspectent votre code sans l'exécuter. Bien qu'ils fonctionnent très bien pour du code Python pur, ils rencontrent les problèmes que j'ai décrits ci-dessus pour les bibliothèques compilées.

Et essayer d'évaluer le code que vous avez dans l'éditeur pour obtenir des compléments n'est généralement pas une bonne idée pour les raisons suivantes:

  1. Ce n'est pas nécessairement un code Python valide tout le temps. Par exemple, supposons que vous ayez laissé une parenthèse non fermée quelque part, mais que vous souhaitiez terminer à un autre moment. Cela devrait fonctionner sans problèmes, non?

  2. Cela pourrait impliquer un calcul très coûteux (par exemple, charger un énorme fichier CSV dans un Dataframe), donc l’évaluer à chaque fois pour obtenir des complétions (et c’est indispensable car votre code est différent chaque fois que vous demandez des complétions) pourrait consommer tout votre RAM en un clin d'oeil.

il serait bon de savoir pourquoi l'auto-complétion est meilleure dans Rodeo (un autre IDE)

La dernière fois que j'ai vérifié (il y a quelques années), Rodeo a évalué votre code pour obtenir des compléments. Cependant, nous allons examiner ce qu’ils font maintenant pour voir si nous pouvons améliorer nos machines d’achèvement.

10
Carlos Cordoba

La complétion automatique fonctionne correctement s'il n'y a PAS d'espaces dans le chemin du répertoire de travail du projet. 

4
ewadaniela

La saisie semi-automatique ne fonctionnait pas du tout pour moi. .___. Alors, j’ai essayé Outils -> Réinitialiser les paramètres d’usine de Spyder et cela a fonctionné.

2
hemanto