summaryrefslogtreecommitdiff
path: root/Lib
diff options
context:
space:
mode:
authorXiang Zhang <angwerzx@126.com>2017-02-28 17:12:52 +0800
committerGitHub <noreply@github.com>2017-02-28 17:12:52 +0800
commit267b9d2fa8efce7c5bc34ce50048ebca8fddf04f (patch)
treeb35a09c9064f25d825c721dc29b18e5bf94143f5 /Lib
parent7c8b3fa31caf866572649e2bc82729d8fc081b89 (diff)
downloadcpython-git-267b9d2fa8efce7c5bc34ce50048ebca8fddf04f.tar.gz
bpo-7769: enable xmlrpc.server.SimpleXMLRPCDispatcher.register_function used as decorator (GH-231)
Diffstat (limited to 'Lib')
-rw-r--r--Lib/test/test_xmlrpc.py13
-rw-r--r--Lib/xmlrpc/server.py8
2 files changed, 14 insertions, 7 deletions
diff --git a/Lib/test/test_xmlrpc.py b/Lib/test/test_xmlrpc.py
index df9c79e3df..ef8ad217ea 100644
--- a/Lib/test/test_xmlrpc.py
+++ b/Lib/test/test_xmlrpc.py
@@ -505,10 +505,6 @@ def http_server(evt, numrequests, requestHandler=None, encoding=None):
def getData():
return '42'
- def my_function():
- '''This is my function'''
- return True
-
class MyXMLRPCServer(xmlrpc.server.SimpleXMLRPCServer):
def get_request(self):
# Ensure the socket is always non-blocking. On Linux, socket
@@ -535,9 +531,14 @@ def http_server(evt, numrequests, requestHandler=None, encoding=None):
serv.register_introspection_functions()
serv.register_multicall_functions()
serv.register_function(pow)
- serv.register_function(lambda x,y: x+y, 'add')
serv.register_function(lambda x: x, 'têšt')
- serv.register_function(my_function)
+ @serv.register_function
+ def my_function():
+ '''This is my function'''
+ return True
+ @serv.register_function(name='add')
+ def _(x, y):
+ return x + y
testInstance = TestInstanceClass()
serv.register_instance(testInstance, allow_dotted_names=True)
evt.set()
diff --git a/Lib/xmlrpc/server.py b/Lib/xmlrpc/server.py
index 849bfddd84..a6275a1b74 100644
--- a/Lib/xmlrpc/server.py
+++ b/Lib/xmlrpc/server.py
@@ -106,6 +106,7 @@ server.handle_request()
from xmlrpc.client import Fault, dumps, loads, gzip_encode, gzip_decode
from http.server import BaseHTTPRequestHandler
+from functools import partial
import http.server
import socketserver
import sys
@@ -204,17 +205,22 @@ class SimpleXMLRPCDispatcher:
self.instance = instance
self.allow_dotted_names = allow_dotted_names
- def register_function(self, function, name=None):
+ def register_function(self, function=None, name=None):
"""Registers a function to respond to XML-RPC requests.
The optional name argument can be used to set a Unicode name
for the function.
"""
+ # decorator factory
+ if function is None:
+ return partial(self.register_function, name=name)
if name is None:
name = function.__name__
self.funcs[name] = function
+ return function
+
def register_introspection_functions(self):
"""Registers the XML-RPC introspection methods in the system
namespace.