2009-01-21 11 views
4

Lorsqu'un objet possède des centaines de méthodes, la complétion des tabulations est difficile à utiliser. Plus souvent qu'autrement, les méthodes intéressantes sont celles définies ou substituées par la classe de l'objet inspecté et non ses classes de base.Comment puis-je faire en sorte que IPython organise les possibilités de complétion des tabulations par classe?

Comment puis-je obtenir IPython pour regrouper ses possibilités de complétion de tabulation afin que les méthodes et les propriétés définies dans la classe de l'objet inspecté viennent en premier, suivies par celles des classes de base?

Il ressemble à la fonction inspect.classify_class_attrs(cls) sans papier avec inspect.getmro(cls) me donnent la plupart des informations dont j'ai besoin (ceux-ci ont été écrits pour mettre en œuvre fonction de python help(object)). Par défaut, readline affiche les compléments par ordre alphabétique, mais la fonction utilisée pour afficher les complétions peut être remplacée par ctypes ou le module readline inclus avec Python 2.6 et supérieur. J'ai remplacé l'affichage des lectures de readline et cela fonctionne très bien. Maintenant tout ce dont j'ai besoin est une méthode pour fusionner les informations par classe (à partir de inspect.* ci-dessus) avec des informations par instance, trier les résultats par ordre de résolution de méthode, joli print et paginate.

Pour un crédit supplémentaire, il serait bon de stocker l'auto-complétion choisie, et d'afficher les choix les plus populaires d'abord la prochaine fois que la saisie semi-automatique est tentée sur le même objet.

Répondre

1

Je ne pense pas que cela puisse être accompli facilement. Il n'y a aucun mécanisme dans Ipython pour l'exécuter dans tous les cas.

Initialement, j'avais pensé que vous pouviez modifier la source d'Ipython pour changer l'ordre (par exemple en changeant la fonction dir2() dans genutils.py). Cependant, il semble que readline classe alphabétiquement les finitions que vous lui passez, cela ne fonctionnera donc pas (du moins pas sans un effort supplémentaire), bien que vous puissiez éventuellement exclure complètement les méthodes de la classe de base.

1

Il semble que je peux utiliser readline.set_completion_display_matches_hook([function]) (nouveau dans Python 2.6) pour afficher les résultats. Le complément renverrait une liste de possibilités comme d'habitude, mais enregistrerait également les résultats de inspect.classify_class_attrs(cls) le cas échéant. Le completion_display_matches_hook devrait contenir une référence au completer pour récupérer la liste la plus récente des complétions plus les informations de classification que je recherche parce que seulement reçoit une liste de noms de match dans ses arguments. Ensuite, le crochet affiche la liste des complétions d'une manière agréable.

5

Depuis que je ne suis pas en utilisant Python 2.6 ou 3.0 encore et n'ont pas readline.set_completion_display_matches_hook(), je peux utiliser ctypes pour définir completion_display_func comme ceci:

from ctypes import * 

rl = cdll.LoadLibrary('libreadline.so') 

def completion_display_func(matches, num_matches, max_length): 
    print "Hello from Python" 
    for i in range(num_matches): 
     print matches[i] 

COMPLETION_DISPLAY_FUNC = CFUNCTYPE(None, POINTER(c_char_p), c_int, c_int) 
hook = COMPLETION_DISPLAY_FUNC(completion_display_func) 
ptr = c_void_p.in_dll(rl, 'rl_completion_display_matches_hook') 
ptr.value = cast(hook, c_void_p).value 

Maintenant, quand je presse « onglet » pour terminer, mon propre fonction imprime la liste des complétions. Donc, cela répond à la question "comment puis-je changer la façon dont readline affiche les complétions".