[Python-ideas] Continuation of `__name__` or a builtin function for general name getting
MRAB
python at mrabarnett.plus.com
Sun Jun 18 18:24:17 EDT 2017
On 2017-06-18 22:38, Alireza Rafiei wrote:
> Hi all,
>
> 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`.
> However, as you can see `__name__` special method returns 'lambda' in
> both cases (just like it was defined
> https://docs.python.org/3/library/stdtypes.html#definition.__name__),
> whereas I think either it should have returned '<lambda>' and 'x' or a
> new function/attribute should exist that does so and more.
>
> For example, consider:
>
> >>> x_1 = 1
> >>> x_2 = 1
> >>> x_3 = 1
> >>> x_4 = x_1
> >>> for i in [x_1, x_2, x_3, x_4]:
> >>> print(i)
> 1
> 1
> 1
> 1
>
>
> Now assume such a function exist and is called `name`. Then:
>
> >>> name(1)
> '1'
> >>> name("Something")
> "Something"
> >>> name(x_1)
> 'x_1'
> >>> name(x_4)
> 'x_4'
> >>> name(x_5)
> 'x_5' # Or an Exception!
> >>> def itername(collection):
> >>> for i in map(lambda x: name(x), collection):
> >>> yield i
> >>>
> >>> for i in [x_1, x_2, x_3, x_4]:
> >>> print(i, name(i))
> 1, 'i'
> 1, 'i'
> 1, 'i'
> 1, 'i'
> >>> for i in itername([x_1, x_2, x_3, x_4]):
> >>> print(i)
> 'x_1'
> 'x_2'
> 'x_3'
> 'x_4'
>
[snip]
That's not correct.
Look at the definition of 'itername'. The lambda returns the result of
name(x), which is 'x'.
Therefore, the correct result is:
'x'
'x'
'x'
'x'
More information about the Python-ideas
mailing list