cpython: b0ae96700301 (original) (raw)
Mercurial > cpython
changeset 86784:b0ae96700301
Issue #19172: Add a get_map() method to selectors. [#19172]
Charles-François Natali cf.natali@gmail.com | |
---|---|
date | Wed, 30 Oct 2013 20:31:04 +0100 |
parents | b49f9aa12dae |
children | 14069b168246 |
files | Doc/library/selectors.rst Lib/selectors.py Lib/test/test_selectors.py |
diffstat | 3 files changed, 61 insertions(+), 1 deletions(-)[+] [-] Doc/library/selectors.rst 8 Lib/selectors.py 27 Lib/test/test_selectors.py 27 |
line wrap: on
line diff
--- a/Doc/library/selectors.rst
+++ b/Doc/library/selectors.rst
@@ -164,6 +164,14 @@ below:
This returns the :class:SelectorKey
instance associated to this file
object, or raises :exc:KeyError
if the file object is not registered.
This returns a :class:`~collections.abc.Mapping` instance mapping[](#l1.11)
registered file objects to their associated :class:`SelectorKey`[](#l1.12)
instance.[](#l1.13)
+ .. class:: DefaultSelector()
--- a/Lib/selectors.py +++ b/Lib/selectors.py @@ -6,7 +6,7 @@ This module allows high-level and effici from abc import ABCMeta, abstractmethod -from collections import namedtuple +from collections import namedtuple, Mapping import functools import select import sys @@ -44,6 +44,25 @@ SelectorKey = namedtuple('SelectorKey', selected event mask and attached data.""" +class _SelectorMapping(Mapping):
- def getitem(self, fileobj):
try:[](#l2.26)
return self._selector._fd_to_key[_fileobj_to_fd(fileobj)][](#l2.27)
except KeyError:[](#l2.28)
raise KeyError("{!r} is not registered".format(fileobj)) from None[](#l2.29)
+ + class BaseSelector(metaclass=ABCMeta): """Base selector class. @@ -62,6 +81,8 @@ class BaseSelector(metaclass=ABCMeta): def init(self): # this maps file descriptors to keys self._fd_to_key = {}
# read-only mapping returned by get_map()[](#l2.42)
self._map = _SelectorMapping(self)[](#l2.43)
def register(self, fileobj, events, data=None): """Register a file object. @@ -162,6 +183,10 @@ class BaseSelector(metaclass=ABCMeta): except KeyError: raise KeyError("{!r} is not registered".format(fileobj)) from None
- def get_map(self):
"""Return a mapping of file objects to selector keys."""[](#l2.52)
return self._map[](#l2.53)
+ def enter(self): return self
--- a/Lib/test/test_selectors.py +++ b/Lib/test/test_selectors.py @@ -153,6 +153,33 @@ class BaseSelectorTestCase(unittest.Test # unknown file obj self.assertRaises(KeyError, s.get_key, 999999)
rd, wr = socketpair()[](#l3.11)
self.addCleanup(rd.close)[](#l3.12)
self.addCleanup(wr.close)[](#l3.13)
keys = s.get_map()[](#l3.15)
self.assertFalse(keys)[](#l3.16)
self.assertEqual(len(keys), 0)[](#l3.17)
self.assertEqual(list(keys), [])[](#l3.18)
key = s.register(rd, selectors.EVENT_READ, "data")[](#l3.19)
self.assertIn(rd, keys)[](#l3.20)
self.assertEqual(key, keys[rd])[](#l3.21)
self.assertEqual(len(keys), 1)[](#l3.22)
self.assertEqual(list(keys), [rd.fileno()])[](#l3.23)
self.assertEqual(list(keys.values()), [key])[](#l3.24)
# unknown file obj[](#l3.26)
with self.assertRaises(KeyError):[](#l3.27)
keys[999999][](#l3.28)
# Read-only mapping[](#l3.30)
with self.assertRaises(TypeError):[](#l3.31)
del keys[rd][](#l3.32)
+ def test_select(self): s = self.SELECTOR() self.addCleanup(s.close)