On 8/3/2010 8:48 AM, Antoine Pitrou wrote: > On Tue, 3 Aug 2010 22:25:01 +1000 > Nick Coghlan<ncoghlan at gmail.com> wrote: >> On Tue, Aug 3, 2010 at 1:40 PM, Eli Bendersky<eliben at gmail.com> wrote: >>> The first print out correctly specifies the line "def foo" is in. However, >>> the second one points to the line with "@dummydecorator" instead of "def >>> bar". [Python 2.6] >>> >>> The side-effects of this behavior can be easily seen in the output of >>> modules like trace and profile. Would you say it's normal, or could this be >>> considered a bug? >> >> Since the decorator is as much a part of the function definition as >> the def line is, I would say that it is correct (the name says >> "firstlineno", not "deflineno"). > > That's debatable. Since writing: > > @b > def a(): > ... > > is equivalent to: > > def a(): > ... > a = b(a) The difference is that 'a=b(a)' is a standalone statement which could moved down with other statements interposed, while '@b' is neither a statement nor expression but a def statement prefix, and is documented as such. A dynamic difference between the constructs, as least with CPython, is that the decorator form does just one namespace binding instead of two. > and in the latter case co_firstlineno points to the "def a()" line. > > Furthermore, co_firstlineno is an attribute of the code object, not the > function object, so it shouldn't ideally depend on whether a decorator > was applied or not. Perhaps. A practical consideration is that it is easier to search forward from the first '@' line to the 'def' line than the reverse. -- Terry Jan Reedy
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4