【问题标题】:Nested dict in D-bus signalsD-bus 信号中的嵌套字典
【发布时间】:2015-07-27 16:26:58
【问题描述】:

有课

class MyService(dbus.service.Object):
  def __init__(self):
    bus_name = dbus.service.BusName(__dbus_object_name__, bus=dbus.SessionBus())
    dbus.service.Object.__init__(self, bus_name, __dbus_object_path__)

  @dbus.service.signal(__dbus_object_name__, signature='a{sv}')
  def TickSignal(self, info):
    print(info)
s = MyService()

尝试发送嵌套字典

s.TickSignal({'a': 'b', 'b': 1, 'c': {'a':'a' }}) 工作正常,但如果嵌套 dict 包含数字会导致异常

s.TickSignal({'a': 'b', 'b': 1, 'c' :{'a':'a', 'b':1 }})

Traceback (most recent call last):
  File "sig.py", line 26, in <module>
    s.TickSignal({'a': 'b', 'b': 1, 'c':{'a':'a', 'b':1}})
  File "/usr/lib/python3/dist-packages/dbus/decorators.py", line 314, in emit_signal
    message.append(signature=signature, *args)
TypeError: Expected a string or unicode object

【问题讨论】:

    标签: python dbus


    【解决方案1】:

    如果没有明确指定签名,您正在使用的 D-Bus 绑定 (dbus-python) 将假定字典中的所有类型都与字典中的任意项相同。在这种情况下,dbus-python 假设字典中的所有项目都是“ss”。

    来自dbus-python tutorial:

    字典由 Python 字典或 dbus.Dictionary(dict 的子类)表示。发送字典时,如果自省签名可用,则将使用该签名;否则,如果将签名关键字参数传递给 Dictionary 构造函数,则将用于确定内容的键和值签名;否则,dbus-python 将从字典的任意项中猜测。

    所以你需要指出字典中有哪些类型。显式指定签名的一种方法是创建如下数据:

    inner = dbus.Dictionary({'a': 'a', 'b': 1}, signature='sv')
    outer = dbus.Dictionary({'a': 'b', 'b': 1, 'c': inner}, signature='sv')
    s.TickSignal(outer)
    

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      你可以像这样使用嵌套字典:

      self._properties = dbus.Dictionary({
                  'Metadata': dbus.Dictionary({
                      'mpris:length': dbus.Int64(2400000000),
                      'mpris:artUrl': 'file:///home/user/1.jpg',
                      'xesam:artist': ['1', '2'],
                      'xesam:title': 'hello world',
                      'xesam:url': '',
                      'xesam:album': 'hehe'
                  }, signature='sv'),
                  'CanControl': True
              }, signature='sv')
      

      它应该可以工作。

      【讨论】:

        猜你喜欢
        • 2015-08-17
        • 2012-06-16
        • 2021-03-31
        • 1970-01-01
        • 2013-05-20
        • 2018-01-29
        • 2018-05-31
        • 2017-01-15
        • 2021-11-28
        相关资源
        最近更新 更多