diff -r b9a5b7e3b32f Lib/test/test_docxmlrpc.py --- a/Lib/test/test_docxmlrpc.py Fri Aug 09 16:20:06 2013 -0400 +++ b/Lib/test/test_docxmlrpc.py Fri Aug 09 23:22:35 2013 +0300 @@ -54,8 +54,18 @@ """ return x + y + def annotation(x: int): + """ Use function annotations. """ + return x + + class ClassWithAnnotation: + def method_annotation(self, x: bytes): + return x.decode() + serv.register_function(add) serv.register_function(lambda x, y: x-y) + serv.register_function(annotation) + serv.register_instance(ClassWithAnnotation()) while numrequests > 0: serv.handle_request() @@ -177,10 +187,7 @@ b'method takes two integers as arguments' b'
\nand returns a double result.
\n ' b'
\nThis server does NOT support system' - b'.methodSignature.\n
' - b'test_method(arg)
Test ' - b'method\'s docs. This method truly does' - b' very little.
'), response) + b'.methodSignature.'), response) def test_autolink_dotted_methods(self): """Test that selfdot values are made strong automatically in the @@ -191,6 +198,18 @@ self.assertIn(b"""Try self.add, too.""", response.read()) + def test_annotations(self): + """ Test that annotations works as expected """ + self.client.request("GET", "/") + response = self.client.getresponse() + self.assertIn( + (b'
annotation' + b'(x: int)
Use function annotations.' + b'
\n
' + b'method_annotation(x: bytes)
'), + response.read()) + + def test_main(): support.run_unittest(DocXMLRPCHTTPGETServer) diff -r b9a5b7e3b32f Lib/xmlrpc/server.py --- a/Lib/xmlrpc/server.py Fri Aug 09 16:20:06 2013 -0400 +++ b/Lib/xmlrpc/server.py Fri Aug 09 23:22:35 2013 +0300 @@ -756,20 +756,23 @@ self.escape(anchor), self.escape(name)) if inspect.ismethod(object): - args, varargs, varkw, defaults = inspect.getargspec(object) + args = inspect.getfullargspec(object) # exclude the argument bound to the instance, it will be # confusing to the non-Python user argspec = inspect.formatargspec ( - args[1:], - varargs, - varkw, - defaults, + args.args[1:], + args.varargs, + args.varkw, + args.defaults, + annotations=args.annotations, formatvalue=self.formatvalue ) elif inspect.isfunction(object): - args, varargs, varkw, defaults = inspect.getargspec(object) + args = inspect.getfullargspec(object) argspec = inspect.formatargspec( - args, varargs, varkw, defaults, formatvalue=self.formatvalue) + args.args, args.varargs, args.varkw, args.defaults, + annotations=args.annotations, + formatvalue=self.formatvalue) else: argspec = '(...)'