[Python-ideas] Quick idea: defining variables from functions that take the variable name
Sven R. Kunze
srkunze at mail.de
Wed Jun 1 11:17:25 EDT 2016
On 01.06.2016 15:53, M.-A. Lemburg wrote:
> On 01.06.2016 15:19, Sven R. Kunze wrote:
>> On 01.06.2016 01:46, Ian Foote wrote:
>>> This is the first syntax I've seen in this thread that seems reasonably
>>> intuitive and pythonic. I don't mind particularly the keyword used (def
>>> or something else), but this structure draws the right parallels in my
>>> mind.
>> Still nobody explained why it needs a special syntax at all.
>>
>> Normal assignment could do it as well as long as the assignment tells
>> the RHS under what name it will be referred to.
> Right. Essentially, we'd only need a way to tell the compiler
> to invoke e.g. a method on the RHS object which gets called
> with the name of the variable it binds (and perhaps the line
> number to allow for e.g. recording the order of definitions).
I think that's the way I would think of it. Although I don't know if I
would prefer a two-step solution (that's what you've described), or a
one-step solution (like an implicitly set magic variable); cf. my reply
to Paul):
https://mail.python.org/pipermail/python-ideas/2016-June/040677.html
In terms of usability, I think the magic variable is easier but it might
be harder to optimize.
> The current byte code for:
>
> x = obj
>
> reads like this:
>
> 2 0 LOAD_GLOBAL 0 (obj)
> 3 STORE_FAST 0 (x)
>
> so if we could get the compiler to generate a method call
> right after the assignment, e.g. obj.recordbinding('x', 2)
> (taking as arguments the name of the variable and the line
> number) we could do lots of interesting stuff.
>
> This could be done via a decorator:
>
> @recordbinding
> x = obj
>
> to result in the compiler generating the following code:
>
> x = obj
> obj.recordbinding('x', 2)
>
> Alternativey, you could do all this without any changes
> to the interpeter by using a trace function which traces
> the execution of a block:
>
> start_recordbingings() # enable trace function
> x = obj # trace function detects assignment and calls
> # obj.recordbinding('x', 2)
> stop_recordbindings() # disable trace function
>
> However, this is very slow.
>
> A second option would be to place the above into a function
> definition and have a decorator apply the byte code
> manipulations to implement the implicit call:
>
> @recordbindings
> def code():
> x = obj
>
> but this would create problems with the local/global
> namespaces.
I hope that's not the only way to optimize it. :(
I am not that deep into CPython development in order to find a better
solution but I think it should be possible for the compiler to find out
whether a callee actually USES that information or not without any
special decoration or something.
Sven
More information about the Python-ideas
mailing list