From ae8014c72a7d304f20d9422009f42bc48fa8f298 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Tue, 24 Apr 2007 17:45:03 +0100 Subject: [PATCH] Fix fd.o #10174: make it possible to return multiple values with no signature. More specifically: when a service method with no signature synchronously returns a tuple that is not a Struct, interpret it as a multi-valued return, rather than as a structure. This is a common Python idiom, and returning a struct makes little sense anyway when D-Bus lets you return multiple values. Returned lists are still interpreted as arrays - returning an array is entirely sensible, and indeed likely to be common. Async service methods are unaffected (there is no ambiguity), and it's still possible to return a structure by returning a dbus.Struct with appropriate contents. https://bugs.freedesktop.org/show_bug.cgi?id=10174 --- dbus/service.py | 8 +++++++- test/test-client.py | 6 ++++++ test/test-service.py | 5 +++++ 3 files changed, 18 insertions(+), 1 deletions(-) diff --git a/dbus/service.py b/dbus/service.py index 775133f..2557de0 100644 --- a/dbus/service.py +++ b/dbus/service.py @@ -486,8 +486,14 @@ class Object(Interface): # no signature, so just turn the return into a tuple and send it as normal else: - if retval == None: + if retval is None: retval = () + elif (isinstance(retval, tuple) + and not isinstance(retval, _dbus_bindings.Struct)): + # If the return is a tuple that is not a Struct, we use it + # as-is on the assumption that there are multiple return + # values - this is the usual Python idiom. (fd.o #10174) + pass else: retval = (retval,) diff --git a/test/test-client.py b/test/test-client.py index 49578f7..de180ef 100755 --- a/test/test-client.py +++ b/test/test-client.py @@ -336,6 +336,12 @@ class TestDBusBindings(unittest.TestCase): ret = bus.name_has_owner('org.freedesktop.DBus.Python.TestName') self.assert_(not ret, 'deleting reference failed to release BusName org.freedesktop.DBus.Python.TestName') + def testMultipleReturnWithoutSignature(self): + # https://bugs.freedesktop.org/show_bug.cgi?id=10174 + ret = self.iface.MultipleReturnWithoutSignature() + self.assert_(not isinstance(ret, dbus.Struct), repr(ret)) + self.assertEquals(ret, ('abc', 123)) + """ Remove this for now class TestDBusPythonToGLibBindings(unittest.TestCase): def setUp(self): diff --git a/test/test-service.py b/test/test-service.py index 601ee5e..5c6fcdb 100755 --- a/test/test-service.py +++ b/test/test-service.py @@ -183,6 +183,11 @@ class TestObject(dbus.service.Object, TestInterface): def WhoAmI(self, sender): return sender + @dbus.service.method(IFACE) + def MultipleReturnWithoutSignature(self): + # https://bugs.freedesktop.org/show_bug.cgi?id=10174 + return dbus.String('abc'), dbus.Int32(123) + session_bus = dbus.SessionBus() name = dbus.service.BusName("org.freedesktop.DBus.TestSuitePythonService", bus=session_bus) object = TestObject(name) -- 1.5.1.2