12. yield from
1 def generator(): 1 def subgenerator():
2 yield 'start' 2 yield 1
3
4 yield 1 これまでは 3
4
yield 2
yield 3
5 yield 2 5 yield 4
6 yield 3 6 yield 5
7 yield 4 7
8 yield 5 8
9 9 def generator():
10 10 yield 'start'
11 for v in generator(): 11
12 print(v) 12 for v in subgenerator():
13 yield v
14
15
16 for v in generator():
17 print(v)
13. yield from
1 def generator(): 1 def subgenerator():
2 yield 'start' 2 yield 1
3
4 yield 1 Python3.3では 3
4
yield 2
yield 3
5 yield 2 5 yield 4
6 yield 3 6 yield 5
7 yield 4 7
8 yield 5 8
9 9 def generator():
10 10 yield 'start'
11 for v in generator(): 11
12 print(v) 12 yield from subgenerator()
13
14
15 for v in generator():
16 print(v)
generatorを部品化しやすくるする構文
14. 値をsendする場合
1 def subgenerator(value):
2 while True:
3 x = yield value
1 def generator():
4 if x is not None:
2 value = yield 'start'
5 value += x
3 while True:
6
4 x = yield value
7
5 if x is not None:
8 def generator():
6 value += x
9 value = yield 'start'
7
10 for v in subgenerator(value):
8
11 yield v
9 g = generator()
12
10 print(next(g))
13
11 print(g.send(1))
14 g = generator()
12 print(g.send(2))
15 print(next(g))
13 print(g.send(3))
16 print(g.send(1))
17 print(g.send(2))
18 print(g.send(3))
start start
1 1
3 1
6 1
15. 値をsendする場合
1 def subgenerator(value):
2 while True:
3 x = yield value
sendに対応するyieldは
4 if x is not None:
5 value += x
6
7
ここじゃなくて 8
9
def generator():
value = yield 'start'
10 for v in subgenerator(value):
11 yield v
12
13
ここ 14
15
g = generator()
print(next(g))
16 print(g.send(1))
17 print(g.send(2))
18 print(g.send(3))
start
1
1
1
16. 値をsendする場合
1 def subgenerator(value):
2 while True:
3 x = yield value
1 def generator():
4 if x is not None:
2 value = yield 'start'
5 value += x
3 while True:
6
4 x = yield value
7
5 if x is not None:
8 def generator():
6 value += x
9 value = yield 'start'
7
10 yield from subgenerator(value)
8
11
9 g = generator()
12
10 print(next(g))
13 g = generator()
11 print(g.send(1))
14 print(next(g))
12 print(g.send(2))
15 print(g.send(1))
13 print(g.send(3))
16 print(g.send(2))
17 print(g.send(3))
start start
1 1
3 3
6 6
17. 詳しい話とか
PEP 380 -- Syntax for Delegating to a Subgenerator
http://www.python.org/dev/peps/pep-0380/
atsuoishimotoの日記
Python3 Advent Calendar 二十日目
PEP 380 -- Syntax for Delegating to a Subgenerator
http://d.hatena.ne.jp/atsuoishimoto/20111220
19. raise xxx from yyy
1 class MyException(Exception):
2 pass
3
4
5 def f(value):
6 try:
7 value = int(value)
8 except Exception:
9 raise MyException()
10 return value
11
12
13 f('spam')
$ python3.3 hoge.py
Traceback (most recent call last):
File "hoge.py", line 7, in f
value = int(value)
ValueError: invalid literal for int() with base 10: 'spam'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "hoge.py", line 13, in <module>
f('spam')
File "hoge.py", line 9, in f
raise MyException()
__main__.MyException
20. raise xxx from yyy
1 class MyException(Exception):
2 pass
3
4
5 def f(value):
6 try:
7 value = int(value)
8 except Exception:
9 raise MyException() from None
10 return value
11
12
13 f('spam')
$ python3.3 hoge.py
Traceback (most recent call last):
File "hoge2.py", line 13, in <module>
f('spam')
File "hoge2.py", line 9, in f
raise MyException() from None
__main__.MyException
内部例外の隠 を簡略化できる