[Python-Dev] Changing select.select to accept iterables
Brett C.
bac at OCF.Berkeley.EDU
Sat Sep 6 23:32:25 EDT 2003
Guido van Rossum wrote:
>>>[Brett, about <http://www.python.org/sf/798046>]
>
> Since Tim thinks it's okay to change (and since I now know what the OP
> wanted) you have my blessing to give this a try.
>
OK, done. I tore out the PyList_Check in select_select() and just put
the PySequence_Fast() call in list2set(), which I renamed seq2set(), so
as to centralize the code and make managing refcounts simpler. I pasted
in an interpreter session at the end of this email showing some checking
I did to make sure I didn't botch anything. If someone could
double-check them and see if they can think of something I may have
missed I would appreciate it.
I made the docstring (as seen below) say that the arguments must be
sequences since that is what PySequence_Fast says it takes in, although
it obviously works with containers. Any objections?
Assuming no one can think of anything that I missed I will then commit
(with appropriate Misc/NEWS and doc changes), change the bug report to
an feature request since that is what it really is, and close it.
-Brett
[passes test_select...]
>>> import test.test_select
timeout = 0
'testing...\n'
timeout = 1
'testing...\n'
timeout = 2
'testing...\n'
timeout = 4
'testing...\n'
timeout = 8
'testing...\n'
timeout = 16
'testing...\n'
timeout = None
'testing...\n'
timeout = None
'testing...\n'
timeout = None
'testing...\n'
timeout = None
'testing...\n'
timeout = None
''
EOF
[24363 refs]
[works with sets as requested...]
>>> from sets import Set
[26557 refs]
>>> from select import select
[26559 refs]
>>> read_FILE = file("README", 'r')
[26567 refs]
>>> write_FILE = file("@test", 'w')
[26574 refs]
>>> print select(Set([write_FILE]), Set([read_FILE]), [], 0)
([<open file '@test', mode 'w' at 0x5051e0>], [<open file 'README', mode
'r' at 0x486550>], [])
[26607 refs]
[modified docstring to say it works with sequences...]
>>> help(select)
Help on built-in function select:
select(...)
select(rlist, wlist, xlist[, timeout]) -> (rlist, wlist, xlist)
Wait until one or more file descriptors are ready for some kind of I/O.
The first three arguments are sequences of file descriptors to be
waited for:
...
[new error message on improper arguments...]
>>> print select(1, 2, 3, 0)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: arguments 1-3 must be sequences
[39435 refs]
[managed to not screw up refcounts =) ...]
>>> print select(Set([write_FILE]), Set([read_FILE]), [], 0)
([<open file '@test', mode 'w' at 0x5051e0>], [<open file 'README', mode
'r' at 0x486550>], [])
[39435 refs]
>>> print select(Set([write_FILE]), Set([read_FILE]), [], 0)
([<open file '@test', mode 'w' at 0x5051e0>], [<open file 'README', mode
'r' at 0x486550>], [])
[39435 refs]
[... and of course still works the way it originally did.]
>>> print select([write_FILE], [read_FILE], [], 0)
([<open file '@test', mode 'w' at 0x5051e0>], [<open file 'README', mode
'r' at 0x486550>], [])
[39435 refs]
More information about the Python-Dev
mailing list