(original) (raw)
changeset: 81134:1c9c0f92df65 branch: 3.3 parent: 81132:5db0833f135b user: Serhiy Storchaka storchaka@gmail.com date: Sat Dec 29 21:13:45 2012 +0200 files: Doc/library/sched.rst Lib/sched.py Misc/NEWS description: Issue #16641: Fix default values of sched.scheduler.enter arguments were modifiable. diff -r 5db0833f135b -r 1c9c0f92df65 Doc/library/sched.rst --- a/Doc/library/sched.rst Sat Dec 29 20:57:52 2012 +0200 +++ b/Doc/library/sched.rst Sat Dec 29 21:13:45 2012 +0200 @@ -36,19 +36,22 @@ >>> import sched, time >>> s = sched.scheduler(time.time, time.sleep) - >>> def print_time(): print("From print_time", time.time()) + >>> def print_time(a='default'): + ... print("From print_time", time.time(), a) ... >>> def print_some_times(): ... print(time.time()) - ... s.enter(5, 1, print_time, ()) - ... s.enter(10, 1, print_time, ()) + ... s.enter(10, 1, print_time) + ... s.enter(5, 2, print_time, argument=('positional',)) + ... s.enter(5, 1, print_time, kwargs={'a': 'keyword'}) ... s.run() ... print(time.time()) ... >>> print_some_times() 930343690.257 - From print_time 930343695.274 - From print_time 930343700.273 + From print_time 930343695.274 positional + From print_time 930343695.275 keyword + From print_time 930343700.273 default 930343700.276 .. _scheduler-objects: @@ -59,7 +62,7 @@ :class:`scheduler` instances have the following methods and attributes: -.. method:: scheduler.enterabs(time, priority, action, argument=[], kwargs={}) +.. method:: scheduler.enterabs(time, priority, action, argument=(), kwargs={}) Schedule a new event. The *time* argument should be a numeric type compatible with the return value of the *timefunc* function passed to the constructor. @@ -67,8 +70,10 @@ *priority*. Executing the event means executing ``action(*argument, **kwargs)``. - *argument* must be a sequence holding the parameters for *action*. - *kwargs* must be a dictionary holding the keyword parameters for *action*. + Optional *argument* argument must be a sequence holding the parameters + for *action* if any used. + Optional *kwargs* argument must be a dictionary holding the keyword + parameters for *action* if any used. Return value is an event which may be used for later cancellation of the event (see :meth:`cancel`). @@ -80,7 +85,7 @@ *kwargs* parameter was added. -.. method:: scheduler.enter(delay, priority, action, argument=[], kwargs={}) +.. method:: scheduler.enter(delay, priority, action, argument=(), kwargs={}) Schedule an event for *delay* more time units. Other than the relative time, the other arguments, the effect and the return value are the same as those for diff -r 5db0833f135b -r 1c9c0f92df65 Lib/sched.py --- a/Lib/sched.py Sat Dec 29 20:57:52 2012 +0200 +++ b/Lib/sched.py Sat Dec 29 21:13:45 2012 +0200 @@ -50,6 +50,8 @@ def __gt__(s, o): return (s.time, s.priority) > (o.time, o.priority) def __ge__(s, o): return (s.time, s.priority) >= (o.time, o.priority) +_sentinel = object() + class scheduler: def __init__(self, timefunc=_time, delayfunc=time.sleep): @@ -60,19 +62,21 @@ self.timefunc = timefunc self.delayfunc = delayfunc - def enterabs(self, time, priority, action, argument=[], kwargs={}): + def enterabs(self, time, priority, action, argument=(), kwargs=_sentinel): """Enter a new event in the queue at an absolute time. Returns an ID for the event which can be used to remove it, if necessary. """ + if kwargs is _sentinel: + kwargs = {} with self._lock: event = Event(time, priority, action, argument, kwargs) heapq.heappush(self._queue, event) return event # The ID - def enter(self, delay, priority, action, argument=[], kwargs={}): + def enter(self, delay, priority, action, argument=(), kwargs=_sentinel): """A variant that specifies the time as a relative time. This is actually the more commonly used interface. diff -r 5db0833f135b -r 1c9c0f92df65 Misc/NEWS --- a/Misc/NEWS Sat Dec 29 20:57:52 2012 +0200 +++ b/Misc/NEWS Sat Dec 29 21:13:45 2012 +0200 @@ -124,6 +124,9 @@ Library ------- +- Issue #16641: Fix default values of sched.scheduler.enter arguments were + modifiable. + - Issue #16504: IDLE now catches SyntaxErrors raised by tokenizer. Patch by Roger Serwy. /storchaka@gmail.com