On Fri, May 11, 2018 at 11:31 PM, Ian Kelly <ian.g.ke...@gmail.com> wrote:
> On Fri, May 11, 2018 at 1:01 AM, Chris Angelico <ros...@gmail.com> wrote:
>> On Fri, May 11, 2018 at 12:38 PM, Ian Kelly <ian.g.ke...@gmail.com> wrote:
>>> Would you also contend that generator functions are wrong because they
>>> pretend to be normal functions?
>>>
>>> def totally_not_a_generator(n):
>>>     while True:
>>>         if n % 2 == 0:
>>>             n //= 2
>>>         else:
>>>             n = n * 3 + 1
>>>         stealthily = n
>>>         yield stealthily
>>>         if n == 1:
>>>             return n
>>>
>>> py> print(totally_not_a_generator(42))  # Lies!
>>> <generator object totally_not_a_generator at 0x77fe4d78c0f8>
>>
>> Let's see. It's created with 'def'. It can be called by putting
>> parentheses after its name. Inside the parentheses, you can give it
>> parameters. When called, it returns a value. Hmm. Sure looks like a
>> function to me.
>>
>> Tell me, which of these are functions and which are not?
>>
>> def tnag5():
>>     return totally_not_a_generator(5)
>>
>> def tnag(n):
>>     return iter(totally_not_a_generator(n))
>>
>> def ILY():
>>     return iter([1, 2, 3]) # your heart starts beating
>>
>> async def what_about_me():
>>     await spam()
>>     return 42
>>
>> def digits_to_number(text):
>>     return int(text, 10)
>>
>> class run_command:
>>     """Compatibility shim for older API"""
>>     def __init__(self, *args):
>>         proc = subprocess.run(*args, stdout=subprocess.PIPE)
>>         self.rc = proc.returncode
>>         self.output = proc.output
>>
>> def run_command(*args):
>>     proc = subprocess.run(*args, stdout=subprocess.PIPE)
>>     return {"rc": proc.returncode, "output": proc.output}
>>
>>
>> The only one that inspect.isfunction() returns False for is the class,
>> and even that is a very function-like class. Every one of these is
>> callable and will return a useful value. Their headers announce one of
>> three things:
>>
>> 1) "I am a function" ==> def name(...):
>> 2) "I am a factory for objects of my own type" ==> class name:
>> 3) "I am a coroutine function" ==> async def name(...):
>>
>> Not one of them is lying. And nor is your totally_not_a_generator. As
>> Steven said, it's a function, and it returns a value.
>
> It's a generator that says it's not a generator. How is that not lying?
>
> Anyway, as far as I can see you just repeated the same argument that
> Steven wrote. I know all this, of course, and I think you missed the
> point. Please read my response to Steven.

You said:

>> Would you also contend that generator functions are wrong because they
>> pretend to be normal functions?

So, yes, your function's name is outright lying. But there's nothing
about it that is *pretending* to be a normal function. It IS a normal
function.

ChrisA
-- 
https://mail.python.org/mailman/listinfo/python-list

Reply via email to