Path: csiph.com!usenet.pasdenom.info!aioe.org!news.stack.nl!newsfeed.xs4all.nl!newsfeed2.news.xs4all.nl!xs4all!post.news.xs4all.nl!not-for-mail Return-Path: X-Original-To: python-list@python.org Delivered-To: python-list@mail.python.org X-Spam-Status: OK 0.014 X-Spam-Evidence: '*H*': 0.97; '*S*': 0.00; 'assignment': 0.07; 'subject:help': 0.08; 'cc:addr:python-list': 0.11; 'def': 0.12; 'assignments': 0.16; 'fancy': 0.16; "function's": 0.16; 'lambda': 0.16; 'rebound': 0.16; 'received:74.55.86': 0.16; 'received:74.55.86.74': 0.16; 'received:smtp.webfaction.com': 0.16; 'received:webfaction.com': 0.16; 'referencing': 0.16; 'statement.': 0.16; 'wrote:': 0.18; 'skip:p 40': 0.19; 'code,': 0.22; '(in': 0.22; 'previously': 0.22; 'cc:addr:python.org': 0.22; 'print': 0.22; 'header:User-Agent:1': 0.23; 'cc:2**0': 0.24; 'cc:no real name:2**0': 0.24; 'equivalent': 0.26; 'references': 0.26; 'this:': 0.26; 'header:In-Reply-To:1': 0.27; 'function': 0.29; 'chris': 0.29; 'am,': 0.29; 'statement': 0.30; 'reader': 0.33; 'comment': 0.34; 'subject:with': 0.35; 'but': 0.35; 'really': 0.36; 'next': 0.36; 'whatever': 0.38; 'skip:p 20': 0.39; 'even': 0.60; 'new': 0.61; "you're": 0.61; 'guarantee': 0.63; 'name': 0.63; 'more': 0.64; 'to:addr:gmail.com': 0.65; 'side': 0.67; 'default': 0.69; 'fact,': 0.69; 'hand': 0.80; 'as:': 0.81; 'ambiguous': 0.84 Date: Mon, 20 May 2013 06:46:38 -0400 From: Ned Batchelder User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/20130509 Thunderbird/17.0.6 MIME-Version: 1.0 To: Chris Angelico Subject: Re: Please help with Threading References: <20130520095419.GA14050@cskk.homeip.net> In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: python-list@python.org X-BeenThere: python-list@python.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: General discussion list for the Python programming language List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Newsgroups: comp.lang.python Message-ID: Lines: 35 NNTP-Posting-Host: 2001:888:2000:d::a6 X-Trace: 1369046808 news.xs4all.nl 15986 [2001:888:2000:d::a6]:59952 X-Complaints-To: abuse@xs4all.nl Xref: csiph.com comp.lang.python:45617 On 5/20/2013 6:09 AM, Chris Angelico wrote: > Referencing a function's own name in a default has to have one of > these interpretations: > > 1) It's a self-reference, which can be used to guarantee recursion > even if the name is rebound > 2) It references whatever previously held that name before this def statement. The meaning must be #2. A def statement is nothing more than a fancy assignment statement. This: def foo(a): return a + 1 is really just the same as: foo = lambda a: a+1 (in fact, they compile to identical bytecode). More complex def's don't have equivalent lambdas, but are still assignments to the name of the function. So your "apparently recursive" print function is no more ambiguous "x = x + 1". The x on the right hand side is the old value of x, the x on the left hand side will be the new value of x. # Each of these updates a name x = x + 1 def print(*args,print=print,lock=Lock(),**kwargs): with lock: print(*args,**kwargs) Of course, if you're going to use that code, a comment might be in order to help the next reader through the trickiness... --Ned.