>
> [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'


You're absolutely right! It should be changed to:

>>> def itername(collection):
> >>>     for i in map(name, collection):
> >>>         yield i



------

 Hmm. So... after x = f,  f.__name__ would be different from x.__name__?


Yes.

------

I should have written my initial email more carefully! There's another
mistake:

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.


It'd be inconsistent to say x.__name__ should return 'x' and f.__name__
should return '<lambda>'. To avoid further confusion of `name` the function
with `__name__`, I take back what I said about `__name__` attribute.
However I can't think of an inconsistency with a builtin function called
`name` or `quote` or alike that behaves as described previously (name(x)
would be 'x' and name(f) would be 'f' and name ("hello") would be "hello"
etc.) and still appreciate any input on it.

On Sun, Jun 18, 2017 at 3:24 PM, MRAB <pyt...@mrabarnett.plus.com> wrote:

> 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/libr
>> ary/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'
>
> _______________________________________________
> Python-ideas mailing list
> Python-ideas@python.org
> https://mail.python.org/mailman/listinfo/python-ideas
> Code of Conduct: http://python.org/psf/codeofconduct/
>
_______________________________________________
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to