我最近一直在尝试使用 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)
则没有问题。有任何想法吗?