[Edu-sig] Scratch pad nuttiness... (re generators)
John Zelle
john.zelle at wartburg.edu
Mon Mar 16 17:38:13 CET 2009
Hi Kirby,
I happen to be working through some Python3.0 issues right now. A couple
comments:
On Monday 16 March 2009 10:42:24 kirby urner wrote:
>
> So then it occurs to me, would there by a way to do a kind of special
> names overloading such that __next__ (that which triggers the next
> cycling to yield) might be replaced with the word kick in some
> namespace, as in kick(o) instead of next(o) -- using Python 3.x syntax
> here i.e. not o.next().
>
> What would a student try, if this were the challenge?
>
> Simple solution:
> >>> def kick(o):
>
> return next(o)
Of couse, the simplest solution is just to bind kick to next:
>>> o = iter(range(10))
>>> kick = next
>>> kick(o)
0
>>> kick(o)
1
That does the trick.
> >>> def f(): # could use a generator expression
>
> for i in range(10):
> yield i
>
> >>> type(f) # just a function so far
>
> <class 'function'>
>
> >>> o = f()
> >>> next(o)
>
> 0
>
> >>> kick(o)
>
> 1
>
> >>> kick(o)
>
> 2
>
> >>> type(o) # a generator once instanced
>
> <class 'generator'>
>
> Another student might think different and try something like this:
> >>> o.__next__
>
> <method-wrapper '__next__' of generator object at 0x8367edc>
>
> >>> o.kick = o.__next__
>
> Traceback (most recent call last):
> File "<pyshell#51>", line 1, in <module>
> o.kick = o.__next__
> AttributeError: 'generator' object has no attribute 'kick'
>
> "Dang, you can't give your generator object a random attribute i
> doesn't already have, write-protected in some way...."
Of course, even if this worked, it wouldn't give you the kick(o) behavior that
you specified above. I could see where one might try this to get the 2.xish
o.kick() behavior. Of course, you could easily get an alias to o's __next__
via simple assignment again:
>>> o = iter(range(10))
>>> kicko = o.__next__
>>> kicko()
0
>>> kicko()
1
> Note that the generator type is inappropriate as a base class for your
> own kind of user class.
>
> >>> class newgen (type(o)):
>
> kick = type(o).__next__
>
>
> Traceback (most recent call last):
> File "<pyshell#10>", line 1, in <module>
> class newgen (type(o)):
> TypeError: type 'generator' is not an acceptable base type
I don't follow the reasoning in this attempt at all.
--John
More information about the Edu-sig
mailing list