¿Cómo puedo trabajar con un GLib.Array en Python?

Estoy escribiendo un complemento para Rhythmbox, en el que una señal GArray pasa en un objeto de tipo GArray . La documentación de GLib Arrays me muestra algunos métodos en los que estoy interesado, pero que no puedo acceder.

Por ejemplo, g_array_index puede conseguirme el noveno elemento en un GArray, pero no puedo llamarlo. El objeto GArray tampoco me muestra ningún método útil.

Para ver lo que quiero decir, haz esto en una consola de Python:

 from gi.repository.GLib import Array x = Array() dir(x) 

Aquí está la salida de dir (x)

 ['__class__', '__delattr__', '__dict__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__gtype__', '__hash__', '__info__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_free_on_dealloc', 'copy', 'data', 'len'] 

No veo ningún método allí leído de la matriz, y nada sobre el g_array_index o cualquier otro método mencionado en la página de documentación de las matrices GLib. Yo tambien lo intenté

  for a in x: print a 

Y también

 list(x) 

Pero recibo un error:

 TypeError: 'Array' object is not iterable 

Intentar x [0] da esto:

 TypeError: 'Array' object does not support indexing 

La propiedad len da la longitud de la matriz como se espera.

La propiedad de data le da esto

introduzca la descripción de la imagen aquí

¿Cómo puedo trabajar con este GLib.Array que estoy pasando?

Estoy corriendo Python 2.7.4

GArray no se anota / exporta correctamente, por lo tanto, no se GArray a un objeto de Python como cabría esperar. De hecho, puede verificar con el fragmento de C al final qué se exporta exactamente y qué verá el módulo Python.

 info_type = 3 [3 == struct] n_fields = 2, n_methods = 0 

Como puede ver, solo se exportan dos campos ( len y data ). Entonces, para responder a tu pregunta: a partir de ahora realmente no puedes trabajar con GLib.Array en Python.

Aquí está el código:

 #include  int main (int argc, char const* argv[]) { GIBaseInfo *info; GIStructInfo *struct_info; GITypelib *typelib; GIInfoType info_type; typelib = g_irepository_require (NULL, "GLib", NULL, 0, NULL); info = g_irepository_find_by_name (NULL, "GLib", "Array"); info_type = g_base_info_get_type(info); g_print ("info_type = %i [3 == struct]\n", info_type); struct_info = (GIStructInfo *) info; g_print ("n_fields = %i, n_methods = %i\n", g_struct_info_get_n_fields (struct_info), g_struct_info_get_n_methods (struct_info)); g_base_info_unref (info); g_typelib_free (typelib); return 0; }