Movatterモバイル変換
[0]ホーム
[Python-Dev] PEP 342: simple example, closure alternative
Ian Bickingianb at colorstudy.com
Thu Aug 25 21:10:43 CEST 2005
I was trying to translate a pattern that uses closures in a language like Scheme (where closed values can be written to) to generators using PEP 342, but I'm not clear exactly how it works; the examples in the PEP have different motivations. Since I can't actually run these examples, perhaps someone could confirm or debug these:A closure based accumulator (using Scheme):(define (accum n) (lambda (incr) (set! n (+ n incr)) n))(define s (accum 0))(s 1) ; -> 1 == 0+1(s 5) ; -> 6 == 1+5So I thought the generator version might look like:def accum(n): while 1: incr = (yield n) or 0 n += incr >>> s = accum(0) >>> s.next() >>> s.send(1)0 >>> s.send(5)1 >>> s.send(1)6Is the order of the output correct? Is there a better way to write accum, that makes it feel more like the closure-based version?Is this for loop correct? >>> s = accum(0) >>> for i in s:... if i >= 10: break... print i,... assert s.send(2) == i0 2 4 6 8Hmm... maybe this would make it feel more closure-like:def closure_like(func): def replacement(*args, **kw): return ClosureLike(func(*args, **kw)) return replacementclass ClosureLike(object): def __init__(self, iterator): self.iterator = iterator # I think this initial .next() is required, but I'm # very confused on this point: assert self.iterator.next() is None def __call__(self, input): assert self.iterator.send(input) is None return self.iterator.next()@closure_likedef accum(n): while 1: # yields should always be in pairs, the first yield is input # and the second yield is output. incr = (yield) # this line is equivalent to (lambda (incr)... n += incr # equivalent to (set! ...) yield n # equivalent to n; this yield always returns None >>> s = accum(0) >>> s(1)1 >>> s(5)6Everything before the first (yield) is equivalent to the closed values between "(define (accum n)" and "(lambda" (for this example there's nothing there; I guess a more interesting example would have closed variables that were written to that were not function parameters).-- Ian Bicking /ianb at colorstudy.com /http://blog.ianbicking.org
More information about the Python-Devmailing list
[8]ページ先頭