The __name__ of a function has nothing to do with an Assign node,
which is simply assigning a value to something. For instance, if you
do:
>>> f = "hello"
you wouldn't expect the string "hello" to have a __name__ - it's just
a string. And a lambda function normally won't be assigned to
anything. You use lambda when there isn't any name:
>>> do_stuff(lambda q: q * 2 + 1)
and you use def when you want to assign it to a name:
>>> def f(): return True
By the time the Assign operation gets performed, the function object -
with all of its attributes, including __name__ - has been completely
created. I'm not sure what your proposal would do to these kinds of
situations, but it shouldn't be modifying the assigned object.
I guess I should have framed it as a `quote` for python. You're absolutely right that it shouldn't be modifying the assigned object and it doesn't. I mentioned the Assign to say that in `x = f`, `x` has name as well, however `x.__name__` returns the name of `f` and not `x`.
As for the `f = "hello"`, the value of the name "f" would be "hello" and the value of the name "hello" would be "hello".
My proposal is to either change the behavior of `__name__` or have something similar that acts globally for all objects and types to get a quote-like behavior, provided that the operands of quotes are atomic.