对pygtk3的反思可能吗?

时间:2011-10-22 12:22:21

标签: python pygtk pygobject gtk3

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和automaticall generated pygobject bindings,我可以在所有示例中尝试将(*args, **kwargs)作为每个gtk方法的参数。

示例:Label.set_text which requires a string

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的工作方式而存在的东西吗? / p>

3 个答案:

答案 0 :(得分:4)

现在,我认为这还没有准备好。但是,您仍然可以手动内省查看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>

因此所有信息都已存在。

答案 1 :(得分:0)

我相信这将是用于创建python模块的C API的方式。例如:

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

唯一的方法(我知道)是查看内置函数的方法参数是查看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.

我已经编写了自己的C python模块,并且已经找到了“修复”(...)的方法,并且解决方法是将它放在我认为容易出错的doc字符串中,因为我必须每次更改功能时都会更新doc字符串。

答案 2 :(得分:0)

您可以使用其他内置函数,如dir(),vars()等。

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

另一个有用的工具是pydoc:

pydoc gi.repository.Gtk