Я недавно экспериментировал с 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, которая предоставляет метод execute, который принимает один параметр, являющийся словарем, который отображает строки в другие словари, которые, в свою очередь, отображают строки в варианты.,Я выбрал этот формат из-за формата, в котором находятся мои словари:
{
"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)
, то проблем не будет.Есть идеи?