From 7184bac5446aefcf576bc8a0a666cfd096b86293 Mon Sep 17 00:00:00 2001 From: Ethan Furman Date: Tue, 14 Oct 2014 18:56:53 -0700 Subject: [PATCH] Issue20386: SocketType is again socket.socket; the IntEnum SOCK constants are SocketKind --- Doc/library/socket.rst | 5 +++++ Lib/socket.py | 12 +++++++----- Lib/test/test_socket.py | 11 +++++++++-- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst index 54c6badb134..5847289f8dc 100644 --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -192,6 +192,11 @@ Exceptions Constants ^^^^^^^^^ + The AF_* and SOCK_* constants are now :class:`AddressFamily` and + :class:`SocketKind` :class:`.IntEnum` collections. + + .. versionadded:: 3.4 + .. data:: AF_UNIX AF_INET AF_INET6 diff --git a/Lib/socket.py b/Lib/socket.py index 6d67b3d2824..a3bdca62bad 100644 --- a/Lib/socket.py +++ b/Lib/socket.py @@ -35,11 +35,13 @@ SocketType -- type object for socket objects error -- exception raised for I/O errors has_ipv6 -- boolean value indicating if IPv6 is supported -Integer constants: +IntEnum constants: AF_INET, AF_UNIX -- socket domains (first argument to socket() call) SOCK_STREAM, SOCK_DGRAM, SOCK_RAW -- socket types (second argument) +Integer constants: + Many other constants may be defined; these may be used in calls to the setsockopt() and getsockopt() methods. """ @@ -71,10 +73,10 @@ AddressFamily = IntEnum('AddressFamily', if name.isupper() and name.startswith('AF_')}) globals().update(AddressFamily.__members__) -SocketType = IntEnum('SocketType', +SocketKind = IntEnum('SocketKind', {name: value for name, value in globals().items() if name.isupper() and name.startswith('SOCK_')}) -globals().update(SocketType.__members__) +globals().update(SocketKind.__members__) def _intenum_converter(value, enum_klass): """Convert a numeric family value to an IntEnum member. @@ -269,7 +271,7 @@ class socket(_socket.socket): def type(self): """Read-only access to the socket type. """ - return _intenum_converter(super().type, SocketType) + return _intenum_converter(super().type, SocketKind) if os.name == 'nt': def get_inheritable(self): @@ -530,6 +532,6 @@ def getaddrinfo(host, port, family=0, type=0, proto=0, flags=0): for res in _socket.getaddrinfo(host, port, family, type, proto, flags): af, socktype, proto, canonname, sa = res addrlist.append((_intenum_converter(af, AddressFamily), - _intenum_converter(socktype, SocketType), + _intenum_converter(socktype, SocketKind), proto, canonname, sa)) return addrlist diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py index 28bf8f5cc1c..15e764098b6 100644 --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -649,6 +649,13 @@ def requireSocket(*args): class GeneralModuleTests(unittest.TestCase): + def test_SocketType_is_socketobject(self): + import _socket + self.assertTrue(socket.SocketType is _socket.socket) + s = socket.socket() + self.assertIsInstance(s, socket.SocketType) + s.close() + def test_repr(self): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) with s: @@ -1224,7 +1231,7 @@ class GeneralModuleTests(unittest.TestCase): self.assertEqual(family, socket.AF_INET) self.assertEqual(str(family), 'AddressFamily.AF_INET') self.assertEqual(type, socket.SOCK_STREAM) - self.assertEqual(str(type), 'SocketType.SOCK_STREAM') + self.assertEqual(str(type), 'SocketKind.SOCK_STREAM') infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM) for _, socktype, _, _, _ in infos: self.assertEqual(socktype, socket.SOCK_STREAM) @@ -1396,7 +1403,7 @@ class GeneralModuleTests(unittest.TestCase): # reprs. with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: self.assertEqual(str(s.family), 'AddressFamily.AF_INET') - self.assertEqual(str(s.type), 'SocketType.SOCK_STREAM') + self.assertEqual(str(s.type), 'SocketKind.SOCK_STREAM') @unittest.skipIf(os.name == 'nt', 'Will not work on Windows') def test_uknown_socket_family_repr(self):