L'une des grandes choses de python est la possibilité d'avoir une introspection sur les méthodes et les fonctions. Par exemple, pour obtenir la signature de fonction de math.log, vous pouvez (en ipython) exécuter ceci:

In [1]: math.log?
Type:       builtin_function_or_method
Base Class: <type 'builtin_function_or_method'>
String Form:    <built-in function log>
Namespace:  Interactive
Docstring:
    log(x[, base])

    Return the logarithm of x to the given base.
    If the base not specified, returns the natural logarithm (base e) of x.

Et voyez que x et éventuellement base sont les paramètres de cette fonction.

Avec le nouveau gtk3 et les liaisons de pygobject générées automatiquement, je peux dans tous les exemples que j'ai essayé de ne jamais obtenir {{ X0}} comme paramètres de chaque méthode gtk.

Exemple: Label.set_text qui nécessite une chaîne:

In [1]: from gi.repository import Gtk
In [2]: mylabel = Gtk.Label("hello")
In [3]: mylabel.set_text?
Type:       instancemethod
Base Class: <type 'instancemethod'>
String Form:    <bound method Label.set_text of <Label object at 0x275b230 (GtkLabel at 0x28cd040)>>
Namespace:  Interactive
File:       /usr/lib/python2.7/dist-packages/gi/types.py
Definition: L.set_text(*args, **kwargs)
Docstring:
    <no docstring>

MAINTENANT LA QUESTION: est-ce (la perte de l'introspection des méthodes pour les liaisons python) que quelque chose va changer encore une fois (la documentation) l'effort est allé dans les pygobjects ou est-ce quelque chose qui est là pour rester en raison de la façon dont les pygobjects fonctionnent?

8
xubuntix 22 oct. 2011 à 16:22

3 réponses

Meilleure réponse

Pour l'instant, je pense que ce n'est pas encore prêt. Cependant, vous pouvez toujours effectuer une introspection manuelle en regardant le fichier Gtk-3.0.gir (dans mon système situé dans /usr/share/gir-1.0/Gtk-3.0.gir).

Le fichier gir est juste un fichier xml qui est censé être utilisé exactement pour explorer l'interface exposée quel que soit le langage de programmation que vous utilisez. Par exemple, la classe Label peut être trouvée à la recherche de <class name="Label". La balise class contient une balise doc contenant des informations détaillées sur ce que ce widget est censé faire. Il existe également de nombreuses method balises et l'une d'elles est celle qui vous intéresse, par exemple: <method name="set_text". À l'intérieur de cette balise method, il y a non seulement une balise doc qui décrit la méthode, mais également une balise parameters qui, à son tour, contient des balises parameter qui sont utilisées pour décrire chaque paramètre en termes de nom, description et type:

<parameters>
  <parameter name="str" transfer-ownership="none">
    <doc xml:whitespace="preserve">The text you want to set</doc>
    <type name="utf8" c:type="gchar*"/>
  </parameter>
</parameters>

Donc, toutes les informations sont déjà là.

4
jcollado 10 nov. 2011 à 12:00

Je crois que ce serait la façon dont l'API C pour créer des modules python le fait. Par exemple:

>>> import inspect
>>> inspect.getargspec(math.log)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\inspect.py", line 813, in getargspec
    raise TypeError('{!r} is not a Python function'.format(func))
TypeError: <built-in function log> is not a Python function

La seule façon (à ma connaissance) est de regarder les paramètres de méthode pour les fonctions intégrées est de regarder la chaîne doc.

>>> help(math.log)
Help on built-in function log in module math:

log(...)
    log(x[, base])

    Return the logarithm of x to the given base.
    If the base not specified, returns the natural logarithm (base e) of x.

J'ai écrit mon propre module C python, et j'ai cherché des moyens de "corriger" le (...) et la solution de contournement est de le placer dans la chaîne de doc que je considère sujette aux erreurs car je devrais mettre à jour le doc chaîne chaque fois que je change la fonction.

0
David 24 oct. 2011 à 16:28

Vous pouvez utiliser une autre fonction intégrée comme dir (), vars (), etc.

http://docs.python.org/library/functions.html

Un autre outil utile est pydoc:

pydoc gi.repository.Gtk
0
shakaran 1 nov. 2011 à 12:05
7859490