回答編集履歴
4
aioodbc.utils を参考に、コルーチン部分をインスタンス変数に格納。(※ 但し、再利用は不可に振る舞いは変更)
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._
|
43
|
+
return self._coro.__await__()
|
36
44
|
|
37
45
|
|
38
46
|
|
3
説明が正確ではなかったので修正。await では使えるが(awaitable)、create_task 等には渡せない。(not-coroutine)
test
CHANGED
@@ -8,7 +8,7 @@
|
|
8
8
|
|
9
9
|
`__await__` メソッドを実装するではだめですか?
|
10
10
|
|
11
|
-
オブジェクトをコルーチンとして振る舞わせることは可能です。
|
11
|
+
オブジェクトをコルーチン~~として~~のように振る舞わせることは可能です。
|
12
12
|
|
13
13
|
|
14
14
|
|
2
説明補足、__await__ 実装のサンプルコード
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
サンプルコードを追加
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
|
+
```
|