2015-12-23 3 views
1

Je me demande si GObject Introspection est actuellement cassé (avec Python au moins) ...Comment accéder aux fonctions liées à GParamSpec à partir de Python GObject Instrospection?

1. Exemple de code court

Essayons ce morceau de code pour obtenir un struct GParamSpec:

# Various imports 
import gi 
gi.require_version('Gst', '1.0') 
from gi.repository import GObject, Gst 
Gst.init(None) 

# Create a Gstreamer element 
element = Gst.ElementFactory.make("lamemp3enc") 
bitrate_property = element.find_property("bitrate") 

si je fais,

>>> type(bitrate_property) 
gobject.GParamSpec 

Tout semble bien que la structure GParamSpec est wh au various useful functions se nourrissent.

2. Problème

Cependant, si je tente d'utiliser effectivement ces structures en Python, je reçois une exception sans aucune indication pour arranger les choses:

>>> GObject.ParamSpec.get_name(bitrate_property) 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-4-63f0daaa3a81> in <module>() 
----> 1 GObject.ParamSpec.get_name(bitrate_property) 

TypeError: argument self: Expected GObject.ParamSpec, but got gobject.GParamSpec 

3. Problème évident , pas de solution?

Le problème est évident : il attend un objet ParamSpec mais il obtient la place un objet GParamSpec. Cependant,

  • Le doc semble impliquer que GParamSpec est l'objet correct (au moins en C);
  • find_property renvoie GParamSpec, tout comme il le fait en C;
  • il n'y a pas de fonctions équivalentes dans GObject.GParamSpec pourtant de telles fonctions existent (au moins en C);
  • même si un cast est nécessaire, il n'y a pas de manière évidente pour transformer un gobject.GParamSpec en GObject.ParamSpec comme demandé.

Est-ce un bug? Est-ce que je manque quelque chose?


EDIT:

Par souci d'exhaustivité, mon but ultime est de récupérer les valeurs valides de GParamSpec struct. Non leurs actuels/par défaut. Je veux également vérifier si la valeur que j'ai donnée à la méthode set_property a été acceptée. Je veux le type GParamSpec, sa plage valide (le cas échéant) ou la liste des valeurs possibles (in enums). La plupart de cela est déjà implémenté dans les fonctions de GObject.ParamSpec.

+0

Je ne sais rien à propos de l'introspection Python, mais je pense que les données que vous voulez éventuellement est sur un sous-type de GParamSpec, comme GParamSpecInt. Pouvez-vous rétrograder à cela et le retirer des membres struct? https: //developer.gnome.org/gobject/unstable/gobject-Standard-Parameter-et-Value-Types.html # GParamSpecInt – mpr

Répondre

0

Je ne suis pas sûr de ce qui se passe avec GObject.ParamSpec vs gobject.GParamSpec, mais vous pouvez accéder à des membres de la spécification param propriétés:

>>> bitrate_property = element.find_property('bitrate') 
>>> print(bitrate_property) 
<GParamInt 'bitrate'> 
>>> type(bitrate_property) 
<type 'gobject.GParamSpec'> 
>>> bitrate_property.name 
'bitrate' 
>>> bitrate_property.minimum 
8 
>>> bitrate_property.maximum 
320