But on which line is the RETURN opcode if there is more than a docstring?
Doesn’t it make sense to have it attached to the last line of the body?
(Too bad about pytype, that kind of change happens — we had this kind of
thing for mypy too, when line numbers in the AST were fixed.)

On Wed, Jul 22, 2020 at 17:29 Gregory P. Smith <g...@krypto.org> wrote:

>
>
> On Wed, Jul 22, 2020 at 5:19 AM Mark Shannon <m...@hotpy.org> wrote:
>
>>
>>
>> On 21/07/2020 9:46 pm, Gregory P. Smith wrote:
>> >
>> >
>> > On Fri, Jul 17, 2020 at 8:41 AM Ned Batchelder <n...@nedbatchelder.com
>> > <mailto:n...@nedbatchelder.com>> wrote:
>> >
>> >     https://www.python.org/dev/peps/pep-0626/ :)
>> >
>> >     --Ned.
>> >
>> >     On 7/17/20 10:48 AM, Mark Shannon wrote:
>> >      > Hi all,
>> >      >
>> >      > I'd like to announce a new PEP.
>> >      >
>> >      > It is mainly codifying that Python should do what you probably
>> >     already
>> >      > thought it did :)
>> >      >
>> >      > Should be uncontroversial, but all comments are welcome.
>> >      >
>> >      > Cheers,
>> >      > Mark.
>> >
>> >
>> > """When a frame object is created, the f_lineno will be set to the line
>> > at which the function or class is defined. For modules it will be set
>> to
>> > zero."""
>> >
>> > Within this PEP it'd be good for us to be very pedantic.  f_lineno is a
>> > single number.  So which number is it given many class and function
>> > definition statements can span multiple lines.
>> >
>> > Is it the line containing the class or def keyword?  Or is it the line
>> > containing the trailing :?
>>
>> The line of the `def`/`class`. It wouldn't change for the current
>> behavior. I'll add that to the PEP.
>>
>> >
>> > Q: Why can't we have the information about the entire span of lines
>> > rather than consider a definition to be a "line"?
>>
>> Pretty much every profiler, coverage tool, and debugger ever expects
>> lines to be natural numbers, not ranges of numbers.
>> A lot of tooling would need to be changed.
>>
>> >
>> > I think that question applies to later sections as well.  Anywhere we
>> > refer to a "line", it could actually mean a span of lines. (especially
>> > when you consider \ continuation in situations you might not otherwise
>> > think could span lines)
>>
>> Let's take an example:
>> ```
>> x = (
>>      a,
>>      b,
>> )
>> ```
>>
>> You would want the BUILD_TUPLE instruction to have a of span lines 1 to
>> 4 (inclusive), rather just line 1?
>> If you wanted to break on the BUILD_TUPLE where you tell pdb to break?
>>
>> I don't see that it would add much value, but it would add a lot of
>> complexity.
>>
>
> We should have the data about the range at bytecode compilation time,
> correct?  So why not keep it?  sure, most existing tooling would just use
> the start of the range as the line number as it always has.  but some
> tooling could find the range useful (ex: semantic code indexing for use in
> display, search, editors, IDEs. Rendering lint errors more accurately
> instead of just claiming a single line or resorting to parsing hacks to
> come up with a range, etc.).  The downside is that we'd be storing a second
> number in bytecode making it slightly larger.  Though it could be stored
> efficiently as a prefixed delta so it'd likely average out as less than 2
> bytes per line number stored.  (i don't have a feeling for our current
> format to know if that is significant or not - if it is, maybe this idea
> just gets nixed)
>
> The reason the range concept was on my mind is due to something not quite
> related but involving a changed idea of a line number in our current system
> that we recently ran into with pytype during a Python upgrade.
>
> """in 3.7, if a function body is a plain docstring, the line number of the
> RETURN_VALUE opcode corresponds to the docstring, whereas in 3.6 it
> corresponds to the function definition.""" (Thanks, Martin & Rebecca!)
>
> ```python
> def no_op():
>   """docstring instead of pass."""
> ```
>
> so the location of what *was* originally an end of line `# pytype:
> disable=bad-return-type` comment (to work around an issue not relevant
> here) turned awkward and version dependent.  pytype is bytecode based, thus
> that is where its line numbers come from.  metadata comments in source can
> only be tied to bytecode via line numbers.  making end of line directives
> occasionally hard to match up.
>
> When there is no return statement, this opcode still exists.  what line
> number does it belong to?  3.6's answer made sense to me.  3.7's seems
> wrong - a docstring isn't responsible for a return opcode.  I didn't check
> what 3.8 and 3.9 do.  An alternate answer after this PEP is that it
> wouldn't have a line number when there is no return statement (pedantically
> correct, I approve! #win).
>
> -gps
>
>
>>
>> Cheers,
>> Mark.
>>
>> >
>> > -gps
>>
> _______________________________________________
> Python-Dev mailing list -- python-dev@python.org
> To unsubscribe send an email to python-dev-le...@python.org
> https://mail.python.org/mailman3/lists/python-dev.python.org/
> Message archived at
> https://mail.python.org/archives/list/python-dev@python.org/message/H3YBK275SUSCR5EHWHYBTJBF655UK7JG/
> Code of Conduct: http://python.org/psf/codeofconduct/
>
-- 
--Guido (mobile)
_______________________________________________
Python-Dev mailing list -- python-dev@python.org
To unsubscribe send an email to python-dev-le...@python.org
https://mail.python.org/mailman3/lists/python-dev.python.org/
Message archived at 
https://mail.python.org/archives/list/python-dev@python.org/message/VJI73SR5NA5B5O2N2Z5M2BRR5LGZU6OS/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to