[Python-ideas] Continuation of `__name__` or a builtin function for general name getting

Chris Angelico rosuav at gmail.com
Sun Jun 18 17:46:09 EDT 2017


On Mon, Jun 19, 2017 at 7:38 AM, Alireza Rafiei
<alireza.rafiei94 at gmail.com> wrote:
> I'm not sure whether this idea has been discussed before or not, so I
> apologize in advanced if that's the case.
>
> Consider the behavior:
>
>> >>> f = lambda: True
>> >>> f.__name__
>> '<lambda>'
>> >>> x = f
>> >>> x.__name__
>> '<lambda>'
>
>
> I'm arguing the behavior above is too brittle/limited and, considering that
> the name of the attribute is `__name__`, not entirely consistent with
> Python's AST. Consider:
>
>> >>> f = lambda: True
>> >>> x = f
>
>
> At the first line, an ast.Assign would be created whose target is an
> ast.Name whose `id` is `f`.
> At the second line, an ast.Assign would be created whose target is an
> ast.Name whose `id` is `x`.

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.

ChrisA


More information about the Python-ideas mailing list