Мне интересно, не работает ли 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
.