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
renvoieGParamSpec
, 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
enGObject.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
.
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