【问题标题】:Pack a GLib.Variant in Python在 Python 中打包 GLib.Variant
【发布时间】:2020-08-05 11:52:10
【问题描述】:

PyGObject API 允许使用 unpack() 方法将 GLib 变体转换为 Python 对象(请参阅 GLib.Variant.unpack)。

但是,有没有直接的方法来做相反的事情?

例如我可以使用 Variant 构造函数创建任意 GLib Variant 对象:

>>> myglibvariant = GLib.Variant("a{sv}", { 'test': GLib.Variant('s', 'value')})

并使用unpack()函数一步创建Python对象:

>>> myglibvariant.unpack()
{'test': 'value'}

但是,有没有一种方法可以一步完成?例如

>>> myglibvariant = GLib.Variant.pack({'test': 'value'})

【问题讨论】:

    标签: python glib


    【解决方案1】:

    不,因为您必须指定类型。 (在{'test': 'value'} 示例中,pack 函数必须猜测类型是a{ss} 还是a{sv},也可能是{ss}{sv}

    【讨论】:

    • 好点,类型的歧义使得无法正确猜测类型。但是,如果给出了类型,那应该是可能的,不是吗?例如。 GLib.Variant.pack("a{sv}", {'test': 'value'})
    • 那个函数是GLib.Variant构造函数,不是吗?
    • 不,当尝试使用上述示例 (GLib.Variant("a{sv}", {'test': 'value'})) 时,它会以 TypeError: argument value: Expected GLib.Variant, but got str 失败。
    • 我认为它可能很聪明,只是让'value' 成为一个变体。似乎unpack() 正在做相反的事情,它将变体转换为字符串......
    • 如果它自动将'value' 包装成一个变体,它仍然不知道该变体是什么类型;可能是's''o''g'
    猜你喜欢
    • 2017-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-23
    • 2017-02-19
    • 2010-09-24
    • 1970-01-01
    相关资源
    最近更新 更多