python - dbus-python 如何获得本地类型的响应?

标签 python casting dbus

我正在玩 dbus-python,我需要获得作为 native Python 类型的响应(f.e dbus.Dictionary - 但通常是任何响应)。是的,可以编写递归转换器,但我想我一定遗漏了一些明显的东西?必须有一种方法可以使用 dbus 将这些怪物转换回 Python native 类型。或者不是?

dbus.Dictionary({dbus.String(u'CanGoNext'): dbus.Boolean(True, variant_level=1), dbus.String(u'CanPause'): dbus.String(u'MinimumRate'): dbus.Int32(14, variant_level=1) ...

最佳答案

虽然 Martin 是对的,但它不适用于由 python 转换为 int 的 bool 值(因为 bool cannot be subclassed )。

In [3]: print(dbus.Boolean(False))
0

不幸的是,递归转换器是保留 bool 值的唯一方法。

这是一个示例实现:

import dbus


def python_to_dbus(data):
    '''
        convert python data types to dbus data types
    '''
    if isinstance(data, str):
        data = dbus.String(data)
    elif isinstance(data, bool):
        # python bools are also ints, order is important !
        data = dbus.Boolean(data)
    elif isinstance(data, int):
        data = dbus.Int64(data)
    elif isinstance(data, float):
        data = dbus.Double(data)
    elif isinstance(data, list):
        data = dbus.Array([python_to_dbus(value) for value in data], signature='v')
    elif isinstance(data, dict):
        data = dbus.Dictionary(data, signature='sv')
        for key in data.keys():
            data[key] = python_to_dbus(data[key])
    return data


def dbus_to_python(data):
    '''
        convert dbus data types to python native data types
    '''
    if isinstance(data, dbus.String):
        data = str(data)
    elif isinstance(data, dbus.Boolean):
        data = bool(data)
    elif isinstance(data, dbus.Int64):
        data = int(data)
    elif isinstance(data, dbus.Double):
        data = float(data)
    elif isinstance(data, dbus.Array):
        data = [dbus_to_python(value) for value in data]
    elif isinstance(data, dbus.Dictionary):
        new_data = dict()
        for key in data.keys():
            new_data[key] = dbus_to_python(data[key])
        data = new_data
    return data

为了更容易在处理 dbus 数据的类中使用,您可以使用装饰器:

def convert_to_python(func):
    def wrapper(*args, **kwargs):
        return dbus_to_python(func(*args, **kwargs))
    return wrapper
...

@convert_to_python
def dbus_method_call(self):
    return self.dbus_proxy.Method()

这样,上面的 dbus_method_call 返回的任何数据都将转换为 native python。

请参阅此相关问题:dbus Variant: How to preserve boolean datatype in Python?

关于python - dbus-python 如何获得本地类型的响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11486443/

相关文章:

python - 为什么 dbus 服务无法正常运行?

c++ - 您能否仅使用一项服务将程序与 D-Bus 消息分开?

python - solvePnPRansac 为 rvecs 和 tvecs 返回零值

python - wxPython处理不同方法之间的事件(按钮和单选按钮)

java - 将通用集合转换为函数参数

c++ - 在 C++ 中通过零扩展将 char 转换为 int

python - 'setdefault' dict 方法的用例

python - 在 NumPy 数组上使用 += 的意外结果

java - 确认方法签名未被更改的测试?

ubuntu - 如何从 GNOME 下的 HUD DBus 服务获取结果?