2011-10-22 27 views
8

Một trong những điều tuyệt vời của python là khả năng có sự quan tâm đến các phương pháp và chức năng. Ví dụ, để có được những chức năng chữ ký của math.log bạn có thể (trong ipython) chạy này:Introspection trên pygtk3 có thể?

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. 

Và thấy rằng x và tùy chọn base là các thông số của chức năng này.

Với gtk3 mới và automaticall generated pygobject bindings, tôi có thể trong tất cả các ví dụ tôi đã thử chỉ nhận được (*args, **kwargs) làm thông số của mọi phương thức gtk.

Ví dụ: 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> 

Bây giờ câu hỏi: là này (sự mất mát của phương pháp mẫn cho bindings python) cái gì đó sẽ thay đổi một lần nữa (tài liệu) nỗ lực đã đi vào pygobjects hoặc là cái gì đó là ở đây để ở lại do cách pygobjects hoạt động?

+2

Câu hỏi hay. Tôi cũng khuyên bạn nên hỏi nó trên bất kỳ giao dịch danh sách gửi thư với pygobject. – ptomato

+0

Điểm của thế hệ kết buộc tự động là cùng một tài liệu C được tạo thông qua gtk-doc hoạt động cho mọi ngôn ngữ. Vì vậy, những gì tôi nghĩ sẽ hữu ích, là các nhà phát triển của pygi để tạo ra các tài liệu cho python giống như cách làm cho các ràng buộc. – erick2red

Trả lời

4

Ngay bây giờ, tôi nghĩ rằng điều này chưa sẵn sàng. Tuy nhiên, bạn vẫn có thể xem xét hướng dẫn sử dụng Gtk-3.0.gir (trong hệ thống của tôi ở số /usr/share/gir-1.0/Gtk-3.0.gir).

Tệp gir chỉ là tệp xml được cho là được sử dụng chính xác để khám phá giao diện tiếp xúc bất kể ngôn ngữ lập trình bạn đang sử dụng. Ví dụ: bạn có thể tìm thấy lớp Label tìm kiếm <class name="Label". Bên trong thẻ class có một thẻ doc với thông tin mở rộng về những gì tiện ích này được cho là phải làm. Ngoài ra còn có nhiều thẻ method và một trong số đó là thẻ bạn quan tâm đến trong ví dụ: <method name="set_text". Bên method thẻ này có không chỉ một thẻ doc mô tả các phương pháp, mà còn là một thẻ parameters đó, đến lượt nó, có chứa một số parameter thẻ được sử dụng để mô tả từng thông số về tên, mô tả và gõ:

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

Vì vậy, tất cả thông tin đã có sẵn.

+0

Vì vậy, tôi kết luận rằng các ràng buộc python sẽ tiếp tục bị phá vỡ nội tâm (vì các tham số ma thuật mà chúng sử dụng để tạo các API), nhưng có thể nhận được ít nhất một tài liệu xây dựng sẵn. – xubuntix

+0

Nó chỉ là một đoán, nhưng tôi muốn nói rằng tài liệu sẽ đến đầu tiên thực sự, nhưng một số khả năng nội tâm sẽ được thêm vào cuối cùng. – jcollado

0

Tôi tin rằng đây sẽ là cách API C để tạo mô-đun python thực hiện điều đó. Ví dụ:

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

Cách duy nhất (tôi biết) là xem tham số phương pháp cho hàm dựng sẵn là xem chuỗi tài liệu.

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

Tôi đã viết mô-đun C python của riêng tôi, và đã tìm cách để "sửa chữa" các (...) và thực hiện giải pháp là đặt nó trong chuỗi doc mà tôi xem xét dễ bị lỗi như tôi 'd phải cập nhật chuỗi tài liệu mỗi khi tôi thay đổi hàm.

0

Bạn có thể sử dụng một built-in chức năng như dir(), vars(), vv

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

Một công cụ hữu ích là pydoc:

pydoc gi.repository.Gtk 
+0

'pydoc gi.repository.Gtk.Label' hiển thị phương thức set_text là:' set_text (* args, ** kwargs) 'do đó, điều này giống như ví dụ của tôi. Phương pháp tôi đã đề cập trong câu hỏi (ipython với?) Chỉ sử dụng những người xây dựng trong chức năng. Chúng không hoạt động trên pygobject (hoặc chính xác hơn: chúng hoạt động nhưng chỉ trả về các đối số 'ma thuật'). – xubuntix

Các vấn đề liên quan