dbus Variant:如何在Python中保留boolean数据类型?

时间:2011-04-26 13:30:13

标签: python gtk boolean dbus variant

我最近一直在尝试使用dbus。但我似乎无法让我的dbus服务猜测布尔值的正确数据类型。请考虑以下示例:

import gtk
import dbus
import dbus.service
from dbus.mainloop.glib import DBusGMainLoop

class Service(dbus.service.Object):

  def __init__(self):
    bus_name = dbus.service.BusName("org.foo.bar", bus = dbus.SessionBus())
    dbus.service.Object.__init__(self, bus_name, "/org/foo/bar")


  @dbus.service.method("org.foo.bar", in_signature = "a{sa{sv}}",
    out_signature = "a{sa{sv}}")
  def perform(self, data):   
    return data


if __name__ == "__main__":
  DBusGMainLoop(set_as_default = True)
  s = Service()
  gtk.main()

这段代码创建了一个dbus服务,它提供了perform方法,该方法接受一个参数,该参数是从字符串映射到其他字典的字典,而字典又将字符串映射到变体。我选择这种格式是因为我的词典所在的格式:

{
  "key1": {
    "type": ("tuple", "value")
  },
  "key2": {
    "name": "John Doe",
    "gender": "male",
    "age": 23
  },
  "test": {
    "true-property": True,
    "false-property": False
  }
}

当我通过我的服务传递这个字典时,布尔值将转换为整数。在我看来,检查不应该那么困难。考虑一下(value是要转换为dbus类型的变量):

if isinstance(value, bool):
  return dbus.Boolean(value)

如果在检查isinstance(value, int)之前完成此检查,那么就没有问题。 有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我不确定你遇到哪个部分有困难。您可以轻松地将这些类型从一种形式转换为另一种形式,如示例dbus.Boolean(val)中所示。您还可以使用isinstance(value, dbus.Boolean)来测试该值是否为dbus布尔值,而不是整数。

Python本机类​​型转换为dbus类型,以便在DBus客户端和使用任何语言编写的服务之间进行通信。因此,发送到DBus服务/从DBus服务接收的任何数据都将包含dbus.*个数据类型。

def perform(self, data):
    for key in ['true-property', 'false-property']:
        val = data['test'][key]
        newval = bool(val)

        print '%s type: %s' % (key, type(val))
        print 'is dbus.Boolean: %s' % isinstance(val, dbus.Boolean)
        print 'Python:', newval
        print '  Dbus:', dbus.Boolean(newval)
    return data

输出:

true-property type: <type 'dbus.Boolean'>
is dbus.Boolean: True
Python: True
  Dbus: 1
false-property type: <type 'dbus.Boolean'>
is dbus.Boolean: True
Python: False
  Dbus: 0