On Fri, 24 Feb 2012 08:53:49 +1100, Chris Angelico wrote: > On Fri, Feb 24, 2012 at 8:41 AM, Arnaud Delobelle <arno...@gmail.com> > wrote: >> _sentinel = object() >> >> def sum(iterable, start=_sentinel): >> if start is _sentinel: >> >> del _sentinel > > Somewhat off-topic: Doesn't the if statement there do a lookup for a > global, which would mean that 'del _sentinel' will cause it to fail? Or > have I missed something here?
Yes, deleting _sentinel will cause the custom sum to fail, and yes, you have missed something. If the caller wants to mess with your library and break it, they have many, many ways to do so apart from deleting your private variables. del _sentinel _sentinel = "something else" sum.__defaults__ = (42,) # mess with the function defaults sum.__code__ = (lambda a, b=None: 100).__code__ # and with func internals sum = None # change your custom sum to something else del sum # or just delete it completely len = 42 # shadow a built-in import builtins; del builtins.range # really screw with you If your application stops working after you carelessly mess with components your application relies on, the right answer is usually: "Don't do that then." Python doesn't try to prevent people from shooting themselves in the foot. Monkey-patching-by-actual-monkeys-for-fun-and-profit-ly y'rs, -- Steven -- http://mail.python.org/mailman/listinfo/python-list