Как получить доступ к функциям, связанным с GParamSpec, из Python GObject Instrospection?

Мне интересно, не работает ли GObject Introspection в настоящее время (по крайней мере, с Python)...

1. Пример короткого кода

Давайте попробуем этот фрагмент кода получить структуру 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")

Теперь, если я это сделаю,

>>> type(bitrate_property)
gobject.GParamSpec

Все кажется прекрасным, поскольку структура GParamSpec — это то, чем питаются различные полезные функции.

2. Проблема

Однако, если я попытаюсь на самом деле использовать эти структуры в Python, я получу исключение без абсолютно никакой подсказки, чтобы разобраться во всем:

>>> 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. Очевидная проблема, нет решения?

Проблема очевидна: он ожидает объект ParamSpec, но вместо этого получает объект GParamSpec. Однако,

  • Документ, кажется, подразумевает, что GParamSpec является правильным объектом (по крайней мере, в C);
  • find_property возвращает GParamSpec, как и в C;
  • в GObject.GParamSpec нет эквивалентных функций, но такие функции существуют (по крайней мере, в C);
  • даже если требуется приведение, нет очевидного способа преобразовать gobject.GParamSpec в GObject.ParamSpec в соответствии с запросом.

Это ошибка? Я что-то упускаю?


ИЗМЕНИТЬ:

Для полноты моей конечной целью является получение допустимых значений из структуры GParamSpec. Не их текущие/по умолчанию. Я также хочу проверить, было ли принято значение, которое я дал методу set_property. Мне нужен тип GParamSpec, его допустимый диапазон (если применимо) или список возможных значений (в перечислениях). Большая часть этого уже реализована в функциях в GObject.ParamSpec.


person JohnW    schedule 23.12.2015    source источник
comment
Я ничего не знаю о самоанализе Python, но я думаю, что данные, которые вам в конечном итоге понадобятся, относятся к подтипу GParamSpec, например GParamSpecInt. Можете ли вы опуститься до этого и вытащить его из членов структуры? developer.gnome.org/gobject/ нестабильный/   -  person mpr    schedule 29.12.2015


Ответы (1)


Я не уверен, что происходит с GObject.ParamSpec против gobject.GParamSpec, но вы можете получить доступ к членам спецификации param как к свойствам:

>>> 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
person Philip Withnall    schedule 07.03.2017