Самоанализ на pygtk3 возможен? - PullRequest
8 голосов
/ 22 октября 2011

Одной из замечательных особенностей Python является способность анализировать методы и функции. Например, чтобы получить сигнатуру функции math.log, вы можете (в ipython) выполнить это:

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.

И посмотрите, что x и, необязательно, base являются параметрами этой функции.

С новыми gtk3 и автоматически сгенерированными привязками пигобъектов я могу во всех примерах, которые я когда-либо пробовал, получить (*args, **kwargs) в качестве параметров каждого метода gtk.

Пример: Label.set_text , для которого требуется строка :

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>

СЕЙЧАС ВОПРОС: это (потеря интроспекции метода для привязок Python) что-то, что изменится еще раз (документирование) усилий, перешло в pygobjects, или это то, что должно остаться здесь из-за работы pygobjects? 1019 *

Ответы [ 3 ]

4 голосов
/ 10 ноября 2011

Прямо сейчас, я думаю, что это еще не готово. Тем не менее, вы все равно можете выполнить ручной самоанализ, просматривая файл Gtk-3.0.gir (в моей системе, расположенный в /usr/share/gir-1.0/Gtk-3.0.gir).

GIR-файл - это просто XML-файл, который должен использоваться именно для изучения открытого интерфейса независимо от используемого вами языка программирования. Например, класс Label можно найти в поиске <class name="Label". Внутри тега class есть тег doc с обширной информацией о том, что должен делать этот виджет. Также есть много тегов method, и один из них интересует вас в вашем примере: <method name="set_text". Внутри этого тега method есть не только тег doc, описывающий метод, но также тег parameters, который, в свою очередь, содержит тег parameter, который используется для описания каждого параметра с точки зрения имени, описания и введите:

<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>

Так что вся информация уже есть.

0 голосов
/ 01 ноября 2011

Вы можете использовать другие встроенные функции, такие как dir (), vars () и т. Д.

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

Еще одним полезным инструментом является pydoc:

pydoc gi.repository.Gtk
0 голосов
/ 24 октября 2011

Я считаю, что именно так C API для создания модулей Python делает это.Например:

>>> 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

Единственный способ (о котором я знаю) - это посмотреть на параметры метода для встроенных функций, это посмотреть на строку документа.

>>> 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.

IЯ написал свой собственный модуль на C Python и искал способы «исправить» (...), и обходной путь - поместить его в строку документа, которую я считаю подверженной ошибкам, так как мне пришлось бы обновлять строку документакаждый раз, когда я меняю функцию.

...