summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGiampaolo Rodolà <g.rodola@gmail.com>2010-08-17 15:30:23 (GMT)
committerGiampaolo Rodolà <g.rodola@gmail.com>2010-08-17 15:30:23 (GMT)
commitccfb91c89f9d7515356f31fff4af4c5cbd5eef7a (patch)
treebec4fcc901fce3653e504c5f24ca0983f2e1e861
parent67b21b7547feee634bbecafeb88606ff350c0d3c (diff)
downloadcpython-ccfb91c89f9d7515356f31fff4af4c5cbd5eef7a.zip
cpython-ccfb91c89f9d7515356f31fff4af4c5cbd5eef7a.tar.gz
cpython-ccfb91c89f9d7515356f31fff4af4c5cbd5eef7a.tar.bz2
fix issue #8866: parameters passed to socket.getaddrinfo can now be specified as single keyword arguments.
-rw-r--r--Doc/library/socket.rst13
-rw-r--r--Doc/whatsnew/3.2.rst4
-rw-r--r--Lib/test/test_socket.py22
-rw-r--r--Misc/NEWS3
-rw-r--r--Modules/socketmodule.c12
5 files changed, 44 insertions, 10 deletions
diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst
index f340920..581756f 100644
--- a/Doc/library/socket.rst
+++ b/Doc/library/socket.rst
@@ -214,7 +214,7 @@ The module :mod:`socket` exports the following constants and functions:
*source_address* was added.
-.. function:: getaddrinfo(host, port, family=0, socktype=0, proto=0, flags=0)
+.. function:: getaddrinfo(host, port, family=0, type=0, proto=0, flags=0)
Translate the *host*/*port* argument into a sequence of 5-tuples that contain
all the necessary arguments for creating a socket connected to that service.
@@ -223,7 +223,7 @@ The module :mod:`socket` exports the following constants and functions:
port number or ``None``. By passing ``None`` as the value of *host*
and *port*, you can pass ``NULL`` to the underlying C API.
- The *family*, *socktype* and *proto* arguments can be optionally specified
+ The *family*, *type* and *proto* arguments can be optionally specified
in order to narrow the list of addresses returned. Passing zero as a
value for each of these arguments selects the full range of results.
The *flags* argument can be one or several of the ``AI_*`` constants,
@@ -233,9 +233,9 @@ The module :mod:`socket` exports the following constants and functions:
The function returns a list of 5-tuples with the following structure:
- ``(family, socktype, proto, canonname, sockaddr)``
+ ``(family, type, proto, canonname, sockaddr)``
- In these tuples, *family*, *socktype*, *proto* are all integers and are
+ In these tuples, *family*, *type*, *proto* are all integers and are
meant to be passed to the :func:`socket` function. *canonname* will be
a string representing the canonical name of the *host* if
:const:`AI_CANONNAME` is part of the *flags* argument; else *canonname*
@@ -249,10 +249,13 @@ The module :mod:`socket` exports the following constants and functions:
connection to ``www.python.org`` on port 80 (results may differ on your
system if IPv6 isn't enabled)::
- >>> socket.getaddrinfo("www.python.org", 80, 0, 0, socket.SOL_TCP)
+ >>> socket.getaddrinfo("www.python.org", 80, proto=socket.SOL_TCP)
[(2, 1, 6, '', ('82.94.164.162', 80)),
(10, 1, 6, '', ('2001:888:2000:d::a2', 80, 0, 0))]
+ .. versionchanged:: 3.2
+ parameters can now be passed as single keyword arguments.
+
.. function:: getfqdn([name])
Return a fully qualified domain name for *name*. If *name* is omitted or empty,
diff --git a/Doc/whatsnew/3.2.rst b/Doc/whatsnew/3.2.rst
index 2c625a8..d03a67f 100644
--- a/Doc/whatsnew/3.2.rst
+++ b/Doc/whatsnew/3.2.rst
@@ -181,6 +181,10 @@ New, Improved, and Deprecated Modules
(Contributed by Georg Brandl; :issue:`5675`.)
+* Parameters passed to :func:`socket.getaddrinfo()` function can now be
+ specified as single keyword arguments.
+
+ (Contributed by Giampaolo Rodolà; :issue:`8866`.)
Multi-threading
===============
diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py
index 48ba5f0..02c99b4 100644
--- a/Lib/test/test_socket.py
+++ b/Lib/test/test_socket.py
@@ -614,6 +614,28 @@ class GeneralModuleTests(unittest.TestCase):
# usually do this
socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
socket.AI_PASSIVE)
+ # test keyword arguments
+ a = socket.getaddrinfo(HOST, None)
+ b = socket.getaddrinfo(host=HOST, port=None)
+ self.assertEqual(a, b)
+ a = socket.getaddrinfo(HOST, None, socket.AF_INET)
+ b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
+ self.assertEqual(a, b)
+ a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
+ b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
+ self.assertEqual(a, b)
+ a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
+ b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
+ self.assertEqual(a, b)
+ a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
+ b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
+ self.assertEqual(a, b)
+ a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
+ socket.AI_PASSIVE)
+ b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
+ type=socket.SOCK_STREAM, proto=0,
+ flags=socket.AI_PASSIVE)
+ self.assertEqual(a, b)
@unittest.skipUnless(thread, 'Threading required for this test.')
diff --git a/Misc/NEWS b/Misc/NEWS
index 4b52c2b..8e68e71 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -93,6 +93,9 @@ Extensions
Library
-------
+- Issue #8866: parameters passed to socket.getaddrinfo can now be specified as
+ single keyword arguments.
+
- Address XXX comment in dis.py by having inspect.py prefer to reuse the
dis.py compiler flag values over defining its own
diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c
index b1a616e..ea546da 100644
--- a/Modules/socketmodule.c
+++ b/Modules/socketmodule.c
@@ -3822,8 +3822,10 @@ socket_inet_ntop(PyObject *self, PyObject *args)
/*ARGSUSED*/
static PyObject *
-socket_getaddrinfo(PyObject *self, PyObject *args)
+socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
{
+ static char* kwnames[] = {"host", "port", "family", "type", "proto",
+ "flags", 0};
struct addrinfo hints, *res;
struct addrinfo *res0 = NULL;
PyObject *hobj = NULL;
@@ -3837,8 +3839,8 @@ socket_getaddrinfo(PyObject *self, PyObject *args)
family = socktype = protocol = flags = 0;
family = AF_UNSPEC;
- if (!PyArg_ParseTuple(args, "OO|iiii:getaddrinfo",
- &hobj, &pobj, &family, &socktype,
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
+ kwnames, &hobj, &pobj, &family, &socktype,
&protocol, &flags)) {
return NULL;
}
@@ -4105,8 +4107,8 @@ static PyMethodDef socket_methods[] = {
{"inet_ntop", socket_inet_ntop,
METH_VARARGS, inet_ntop_doc},
#endif
- {"getaddrinfo", socket_getaddrinfo,
- METH_VARARGS, getaddrinfo_doc},
+ {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
+ METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
{"getnameinfo", socket_getnameinfo,
METH_VARARGS, getnameinfo_doc},
{"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,