回答編集履歴

4

aioodbc.utils を参考に、コルーチン部分をインスタンス変数に格納。(※ 但し、再利用は不可に振る舞いは変更)

2020/12/19 02:20

投稿

teamikl
teamikl

スコア8817

test CHANGED
@@ -28,11 +28,19 @@
28
28
 
29
29
  print("init C")
30
30
 
31
+ self._coro = self._sleep()
32
+
33
+
34
+
35
+ def __del__(self):
36
+
37
+ print("del C")
38
+
31
39
 
32
40
 
33
41
  def __await__(self):
34
42
 
35
- return self._sleep().__await__()
43
+ return self._coro.__await__()
36
44
 
37
45
 
38
46
 

3

説明が正確ではなかったので修正。await では使えるが(awaitable)、create_task 等には渡せない。(not-coroutine)

2020/12/19 02:20

投稿

teamikl
teamikl

スコア8817

test CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  `__await__` メソッドを実装するではだめですか?
10
10
 
11
- オブジェクトをコルーチンとして振る舞わせることは可能です。
11
+ オブジェクトをコルーチン~~として~~のように振る舞わせることは可能です。
12
12
 
13
13
 
14
14
 

2

説明補足、__await__ 実装のサンプルコード

2020/12/18 10:32

投稿

teamikl
teamikl

スコア8817

test CHANGED
@@ -44,7 +44,9 @@
44
44
 
45
45
  async def main():
46
46
 
47
- await C()
47
+ await C() # <--- コンストラクタに async,await は使えないが、
48
+
49
+ # __await__ を実装する事で、オブジェクト自身を awaitable に
48
50
 
49
51
  print("DONE")
50
52
 

1

サンプルコードを追加

2020/12/18 05:23

投稿

teamikl
teamikl

スコア8817

test CHANGED
@@ -9,3 +9,51 @@
9
9
  `__await__` メソッドを実装するではだめですか?
10
10
 
11
11
  オブジェクトをコルーチンとして振る舞わせることは可能です。
12
+
13
+
14
+
15
+ ----
16
+
17
+
18
+
19
+ ```python
20
+
21
+ import asyncio
22
+
23
+
24
+
25
+ class C:
26
+
27
+ def __init__(self):
28
+
29
+ print("init C")
30
+
31
+
32
+
33
+ def __await__(self):
34
+
35
+ return self._sleep().__await__()
36
+
37
+
38
+
39
+ async def _sleep(self):
40
+
41
+ await asyncio.sleep(1)
42
+
43
+
44
+
45
+ async def main():
46
+
47
+ await C()
48
+
49
+ print("DONE")
50
+
51
+
52
+
53
+
54
+
55
+ if __name__ == "__main__":
56
+
57
+ asyncio.run(main())
58
+
59
+ ```