2011-10-22 3 views
8

Pythonの大きな点の1つは、メソッドや関数にイントロスペクションを持つ能力です。pygtk3のイントロスペクションは可能ですか?

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は、この関数のパラメータであることを参照してください。例として、あなたは(ipythonで)これを実行することができますmath.logの関数のシグネチャを取得します。

新しいgtk3とautomaticall generated pygobject bindingsでは、すべての例で、すべてのgtkメソッドのパラメータとして(*args, **kwargs)を取得しました。

例:Label.set_text which requires a string

NOW
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の仕組みのためにここに滞在しているこの何か?

+2

大きな質問です。私はpygobjectを扱っているメーリングリストについてもそれを尋ねることをお勧めします。 – ptomato

+0

自動バインディング世代のポイントは、gtk-docによって生成された同じC言語のドキュメントがすべての言語で動作することです。ですから、Pythonの開発者は、バインディングの場合と同じようにPython用のドキュメントを生成することになります。 – erick2red

答えて

4

今、私は思いますこれはまだ準備ができていません。しかし、Gtk-3.0.girファイル(私のシステムでは/usr/share/gir-1.0/Gtk-3.0.girに位置しています)を見て、手動のイントロスペクションを行うことはできます。

girファイルは、使用しているプログラミング言語に関係なく公開されたインターフェイスを正確に調べるために使用されるxmlファイルです。たとえば、Labelクラスは<class name="Label"を検索して見つけることができます。 classタグの中には、docというタグがあり、このウィジェットの機能に関する広範な情報があります。また、多くのmethodタグがあり、そのうちの1つは、あなたが興味を持っている例です:<method name="set_text"

<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> 
:この methodタグ内だけではなく、順番に、名前、説明の用語や種類で各パラメータを記述するために使用されるいくつかの parameterタグを含む、方法が、また、 parametersタグを記述し docタグがあります

したがって、すべての情報はすでに存在しています。

+0

私は、Pythonバインディングは(APIを作成するために使用する魔法のパラメータのために)壊れたイントロスペクションを引き続き持ちますが、少なくとも実際のビルドインのドキュメントを取得する可能性があると結論づけます。 – xubuntix

+0

これは単なる推測ですが、ドキュメントは実際に最初に来ると思いますが、いくつかのイントロスペクション機能が最終的に追加されると思います。 – jcollado

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文字列を更新する必要があります。など

0

あなたは)(dirのような別の組み込み関数を使用することができ、(varsの)、

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

別の有用なツールがpydocです:

pydoc gi.repository.Gtk 
+0

'pydoc gi.repository.Gtk.Label'は、set_textメソッドを' set_text(* args、** kwargs) 'として表示します。これは私の例と同じです。私が質問(ipython with?)で述べたメソッドは、それらの関数を使ってビルドするだけです。彼らはpygobject(またはより正確には動作しません:彼らは動作しますが、単にそれらの '魔法の引数を返す)。 – xubuntix

関連する問題