[Python-3000] optional argument annotations

Brett Cannon brett at python.org
Mon Nov 27 21:35:20 CET 2006


On 11/26/06, Tony Lownds <tony at pagedna.com> wrote:
>
>
> On Nov 26, 2006, at 1:10 PM, Brett Cannon wrote:
>
> On 11/24/06, Tony Lownds <tony at pagedna.com> wrote:
> >
> > > Obviously signature objects would grow support for annotations, but I
> > > still need the information to be carried on the code object to
> > > incorporate into signature objects.
> > >
> >
> > Signature objects still need a way to know the nested parameters, right?
> >
>
>
> They already handle them.
>
>
> I see, through the bytecode inspection that inspect.py does.
>

Yep.

How about a co_argnames attribute? eg for
> >
> > def f((x, y), z): pass
> >
> > f.func_code.co_argnames would be (('x', 'y'), 'z')
>
>
> That's fine, but the compiler would need to change if it were to use
> this.  Plus I am still hoping to make nested parameters disappear in Py3K (I
> won't be pushing for it any sooner than PyCon, though).
>
>
> Yes, it is the compiler that would implement this. I have it implemented
> as follows.
>
> >>> def f(a, (b, c), d=1, *e, f, g=1, **h): pass
> ...
> >>> f.func_code.co_argnames
> ('a', ('b', 'c'), 'd', '*e', 'f', 'g', '**h')
>
> However since inspect.py doesn't need this and neither does my code, I'll
> drop it.
>

OK.

I need to implement something like this to properly build
> > func_annotations
> > inside MAKE_FUNCTION.
>
>
>
> I don't quite follow.  Don't you already have support in MAKE_FUNCTION
> when the object is created?
>
>
> The support available is the code object and anything pushed onto the
> stack. Just looking at the code object,
> the information is simply not available outside of reverse-engineering
> co_code (as inspect does).
> I ended up pushing a tuple of argument names onto the stack.
>
> eg, for
>
> def f((x:1, y))->3: pass
>
> the bytecode is...
>
>   1           0 LOAD_CONST               0 (1)
>               3 LOAD_CONST               1 (3)
>               6 LOAD_CONST               2 (('x', 'return'))
>               9 LOAD_CONST               3 (<code object f at 0xb7ecd848,
> file "<str>", line 1>)
>              12 EXTENDED_ARG             3
>              15 MAKE_FUNCTION        196608
>              18 STORE_NAME               0 (f)
>              21 LOAD_CONST               4 (None)
>              24 RETURN_VALUE
>
> (the argument is so big because I need to pass the # of annotations in the
> argument of MAKE_FUNCTION so
> that the stack effect can be easily calculated)
>

Ah, I see how you are doing it.  Well, as I said, as long as the info is
available in some way that can be used to infer what the type annotations
are per argument then I should be fine.  It doesn't have to be overly clean
just for signature objects.

-Brett
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.python.org/pipermail/python-3000/attachments/20061127/eb33f641/attachment.htm 


More information about the Python-3000 mailing list