From c04957bff3a53ba3d051b7c4148a48ec5238f3cb Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sat, 29 Dec 2012 21:13:45 +0200 Subject: Issue #16641: Fix default values of sched.scheduler.enter arguments were modifiable. --- Doc/library/sched.rst | 23 ++++++++++++++--------- Lib/sched.py | 8 ++++++-- Misc/NEWS | 3 +++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/Doc/library/sched.rst b/Doc/library/sched.rst index f6bd43f..e73ba40 100644 --- a/Doc/library/sched.rst +++ b/Doc/library/sched.rst @@ -36,19 +36,22 @@ Example:: >>> 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 @@ Scheduler Objects :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 @@ Scheduler Objects *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 @@ Scheduler Objects *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 --git a/Lib/sched.py b/Lib/sched.py index e523bc1..4b1f7ac 100644 --- a/Lib/sched.py +++ b/Lib/sched.py @@ -50,6 +50,8 @@ class Event(namedtuple('Event', 'time, priority, action, argument, kwargs')): 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 @@ class scheduler: 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 --git a/Misc/NEWS b/Misc/NEWS index ce906a0..3317f68 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -124,6 +124,9 @@ Core and Builtins 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. -- cgit v0.12