可以对 pygtk3 进行自省吗?
Posted
技术标签:
【中文标题】可以对 pygtk3 进行自省吗?【英文标题】:Introspection on pygtk3 possible? 【发布时间】:2011-12-13 03:43:27 【问题描述】: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 的工作方式而保留下来的东西?
【问题讨论】:
好问题。我还建议在任何与 pygobject 相关的邮件列表中询问它。 自动绑定生成的要点是,通过 gtk-doc 生成的相同 C 文档适用于每种语言。所以,我认为应该有用的是 pygi 的开发人员以与绑定相同的方式为 python 生成文档。 【参考方案1】:现在,我认为这还没有准备好。但是,您仍然可以手动检查 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>
所以所有信息都已经存在了。
【讨论】:
因此我得出结论,python 绑定将继续破坏自省(因为它们用于创建 API 的神奇参数),但至少可能会获得一个有效的内置文档。 这只是一个猜测,但我会说文档确实会放在第一位,但最终会添加一些自省功能。【参考方案2】:我相信这将是用于创建 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
(据我所知)查看内置函数的方法参数的唯一方法是查看文档字符串。
>>> 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 字符串中,因为我必须这样做每次更改函数时更新文档字符串。
【讨论】:
【参考方案3】:您可以使用其他内置函数,如 dir()、vars() 等。
http://docs.python.org/library/functions.html
另一个有用的工具是pydoc:
pydoc gi.repository.Gtk
【讨论】:
pydoc gi.repository.Gtk.Label
将方法 set_text 显示为:set_text(*args, **kwargs)
所以这与我的示例相同。我在问题中提到的方法(带有?的 ipython)只使用了那些内置函数。它们对 pygobject 不起作用(或更准确地说:它们起作用但只是返回那些“神奇”的参数)。以上是关于可以对 pygtk3 进行自省吗?的主要内容,如果未能解决你的问题,请参考以下文章