diff --git a/Lib/test/test_docxmlrpc.py b/Lib/test/test_docxmlrpc.py
index d6ca45847ec..7086d9a6a12 100644
--- a/Lib/test/test_docxmlrpc.py
+++ b/Lib/test/test_docxmlrpc.py
@@ -54,8 +54,18 @@ def server(evt, numrequests):
"""
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 @@ class DocXMLRPCHTTPGETServer(unittest.TestCase):
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 @@ class DocXMLRPCHTTPGETServer(unittest.TestCase):
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 --git a/Lib/xmlrpc/server.py b/Lib/xmlrpc/server.py
index 54e172670b1..78ca4e0a4af 100644
--- a/Lib/xmlrpc/server.py
+++ b/Lib/xmlrpc/server.py
@@ -756,20 +756,23 @@ class ServerHTMLDoc(pydoc.HTMLDoc):
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 = '(...)'
diff --git a/Misc/NEWS b/Misc/NEWS
index d6a645d8870..635a925970f 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -64,6 +64,9 @@ Core and Builtins
Library
-------
+- Issue #8112: xlmrpc.server's DocXMLRPCServer server no longer raises an error
+ if methods have annotations; it now correctly displays the annotations.
+
- Issue #17998: Fix an internal error in regular expression engine.
- Issue #17557: Fix os.getgroups() to work with the modified behavior of