Почему обратные вызовы io_add_watch () получают неправильный объект IOChannel? - PullRequest
0 голосов
/ 16 февраля 2019

Насколько я могу судить из доступных документов, GLib.io_add_watch () должен регистрировать функцию, вызываемую при возникновении условия в IOChannel, и функция обратного вызова должна приниматьсказал IOChannel в качестве первого аргумента.Отлично, кроме того, что это не так.GLib передает полностью другой объект IOChannel обратному вызову.Почему?

Другими словами, почему этот код создает ошибку AssertionError?

#!/usr/bin/env python3

import gi
from gi.repository import GLib

_, _, fd, _ = GLib.spawn_async(['/bin/echo', 'hello'], standard_output=True)

channel = GLib.IOChannel.unix_new(fd)

def on_read(callback_channel, condition):
    assert callback_channel is channel

GLib.io_add_watch(channel, GLib.PRIORITY_DEFAULT, GLib.IO_IN, on_read)

GLib.MainLoop().run()

1 Ответ

0 голосов
/ 16 февраля 2019

IOChannel - это структура GBoxed, а не GObject.Он не имеет идентичности и передается копией.Тот, который вы получаете при обратном вызове, эквивалентен тому, который вы дали, но они не являются тем же объектом, и при этом все их поля не будут иметь одинаковое значение.

...