On Tue, Jun 07, 2016 at 12:53:23AM +0200, M.-A. Lemburg wrote:
On 07.06.2016 00:32, Barry Warsaw wrote:
On Jun 01, 2016, at 03:53 PM, M.-A. Lemburg wrote:
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)
I don't understand the purpose of the second argument, given as 2. Earlier you say that it's the line number. Why is that needed?
I don't see how this actually solves the problem. Apply it to namedtuple:
Record = namedtuple('Record', fields)
If you naively try the decorator:
@recordbinding Record = namedtuple(fields)
that gets converted to:
Record = namedtuple(fields) # TypeError Record.recordbinding('Record') # AttributeError
There's no point in calling a special method on the RHS object, as that requires the object to have been constructed before the method can be called. And that requires the name. So your recordbinding decorator gets called too late.
Even if it worked, I strongly dislike that this turns a one-line expression into a two line statement.
# Status quo: x = sympy.Symbol('x')
# Becomes: @recordbinding x = sympy.Symbol()
which doesn't seem like an improvement to me.
This would work as well and indeed reads better, but you'd need to have the compiler generate:
x = obj recordbinding(obj, 'x', 2)
ie. pass in the object, the bound name and the line number and recordbinding would then have to decide what to do with the parameters.
Again, this is called too late. Your namedtuple needs its name when it is constructed, it can't be constructed first and then the name injected in, even if recordbinding() knew where to inject the name.