mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
fix issue #8866: parameters passed to socket.getaddrinfo can now be specified as single keyword arguments.
This commit is contained in:
parent
67b21b7547
commit
ccfb91c89f
5 changed files with 44 additions and 10 deletions
|
@ -214,7 +214,7 @@ The module :mod:`socket` exports the following constants and functions:
|
||||||
*source_address* was added.
|
*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
|
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.
|
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*
|
port number or ``None``. By passing ``None`` as the value of *host*
|
||||||
and *port*, you can pass ``NULL`` to the underlying C API.
|
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
|
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.
|
value for each of these arguments selects the full range of results.
|
||||||
The *flags* argument can be one or several of the ``AI_*`` constants,
|
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:
|
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
|
meant to be passed to the :func:`socket` function. *canonname* will be
|
||||||
a string representing the canonical name of the *host* if
|
a string representing the canonical name of the *host* if
|
||||||
:const:`AI_CANONNAME` is part of the *flags* argument; else *canonname*
|
: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
|
connection to ``www.python.org`` on port 80 (results may differ on your
|
||||||
system if IPv6 isn't enabled)::
|
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)),
|
[(2, 1, 6, '', ('82.94.164.162', 80)),
|
||||||
(10, 1, 6, '', ('2001:888:2000:d::a2', 80, 0, 0))]
|
(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])
|
.. function:: getfqdn([name])
|
||||||
|
|
||||||
Return a fully qualified domain name for *name*. If *name* is omitted or empty,
|
Return a fully qualified domain name for *name*. If *name* is omitted or empty,
|
||||||
|
|
|
@ -181,6 +181,10 @@ New, Improved, and Deprecated Modules
|
||||||
|
|
||||||
(Contributed by Georg Brandl; :issue:`5675`.)
|
(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
|
Multi-threading
|
||||||
===============
|
===============
|
||||||
|
|
|
@ -614,6 +614,28 @@ class GeneralModuleTests(unittest.TestCase):
|
||||||
# usually do this
|
# usually do this
|
||||||
socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
|
socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
|
||||||
socket.AI_PASSIVE)
|
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.')
|
@unittest.skipUnless(thread, 'Threading required for this test.')
|
||||||
|
|
|
@ -93,6 +93,9 @@ Extensions
|
||||||
Library
|
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
|
- Address XXX comment in dis.py by having inspect.py prefer to reuse the
|
||||||
dis.py compiler flag values over defining its own
|
dis.py compiler flag values over defining its own
|
||||||
|
|
||||||
|
|
|
@ -3822,8 +3822,10 @@ socket_inet_ntop(PyObject *self, PyObject *args)
|
||||||
|
|
||||||
/*ARGSUSED*/
|
/*ARGSUSED*/
|
||||||
static PyObject *
|
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 hints, *res;
|
||||||
struct addrinfo *res0 = NULL;
|
struct addrinfo *res0 = NULL;
|
||||||
PyObject *hobj = NULL;
|
PyObject *hobj = NULL;
|
||||||
|
@ -3837,8 +3839,8 @@ socket_getaddrinfo(PyObject *self, PyObject *args)
|
||||||
|
|
||||||
family = socktype = protocol = flags = 0;
|
family = socktype = protocol = flags = 0;
|
||||||
family = AF_UNSPEC;
|
family = AF_UNSPEC;
|
||||||
if (!PyArg_ParseTuple(args, "OO|iiii:getaddrinfo",
|
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
|
||||||
&hobj, &pobj, &family, &socktype,
|
kwnames, &hobj, &pobj, &family, &socktype,
|
||||||
&protocol, &flags)) {
|
&protocol, &flags)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -4105,8 +4107,8 @@ static PyMethodDef socket_methods[] = {
|
||||||
{"inet_ntop", socket_inet_ntop,
|
{"inet_ntop", socket_inet_ntop,
|
||||||
METH_VARARGS, inet_ntop_doc},
|
METH_VARARGS, inet_ntop_doc},
|
||||||
#endif
|
#endif
|
||||||
{"getaddrinfo", socket_getaddrinfo,
|
{"getaddrinfo", (PyCFunction)socket_getaddrinfo,
|
||||||
METH_VARARGS, getaddrinfo_doc},
|
METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
|
||||||
{"getnameinfo", socket_getnameinfo,
|
{"getnameinfo", socket_getnameinfo,
|
||||||
METH_VARARGS, getnameinfo_doc},
|
METH_VARARGS, getnameinfo_doc},
|
||||||
{"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
|
{"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue