teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

文言変更

2021/12/11 22:09

投稿

actorbug
actorbug

スコア2515

answer CHANGED
@@ -14,7 +14,7 @@
14
14
  b1.func2(b2)
15
15
  ```
16
16
 
17
- ただし、該当のクラスが組み込み型やC拡張モジュールで定義された型など特殊なものだとできない。
17
+ ただし、該当のクラスが特殊な型(組み込み型やC拡張モジュールで定義された型など)だとできない。
18
18
  (こちらの記事の方法であれば可能: [[Python] build-in objectに独自のメソッドを追加する禁断の果実](https://e-tec-memo.herokuapp.com/article/283/))
19
19
  あと、事前に別名で関数として定義しなければならないので、名前付けの問題は残る。
20
20
  (直接ラムダ式を代入することもできるけど、ラムダ式だとできることが限られる)

3

multipledispatch追記、コメントで追加した内容のマージ

2021/12/11 22:09

投稿

actorbug
actorbug

スコア2515

answer CHANGED
@@ -14,12 +14,13 @@
14
14
  b1.func2(b2)
15
15
  ```
16
16
 
17
- ただし、該当のクラスが組み込み型など特殊なものだとできない。
17
+ ただし、該当のクラスが組み込み型やC拡張モジュールで定義された型など特殊なものだとできない。
18
+ (こちらの記事の方法であれば可能: [[Python] build-in objectに独自のメソッドを追加する禁断の果実](https://e-tec-memo.herokuapp.com/article/283/))
18
19
  あと、事前に別名で関数として定義しなければならないので、名前付けの問題は残る。
19
20
  (直接ラムダ式を代入することもできるけど、ラムダ式だとできることが限られる)
20
21
 
21
22
 
22
- あと、[functools.singledispatch](https://docs.python.org/ja/3/library/functools.html#functools.singledispatch)を使う方法もある。
23
+ 他に、[functools.singledispatch](https://docs.python.org/ja/3/library/functools.html#functools.singledispatch)を使う方法もある。
23
24
  ```python
24
25
  from functools import singledispatch
25
26
 
@@ -54,4 +55,26 @@
54
55
  func1(b1, b2)
55
56
  func2(a1, a2)
56
57
  func2(b1, b2)
58
+ ```
59
+
60
+ 先頭引数以外の型も見たいのであれば、[multipledispatch](https://github.com/mrocklin/multipledispatch)をインストールすれば可能。実行例は上と同じ。
61
+ ```python
62
+ from multipledispatch import dispatch
63
+
64
+ @dispatch()
65
+ def func1(a1: modulea.TypeA, a2: modulea.TypeA) -> modulea.TypeA:
66
+ a = a1 + a2
67
+ return a
68
+ @dispatch()
69
+ def func1(b1: moduleb.TypeB, b2: moduleb.TypeB) -> moduleb.TypeB:
70
+ b = b1 + b2
71
+ return b
72
+ @dispatch()
73
+ def func2(a1: modulea.TypeA, a2: modulea.TypeA) -> modulea.TypeA:
74
+ a = a1 - a2
75
+ return a
76
+ @dispatch()
77
+ def func2(b: moduleb.TypeB, b2: moduleb.TypeB) -> moduleb.TypeB:
78
+ b = b1 - b2
79
+ return b
57
80
  ```

2

注意追加

2021/12/11 21:54

投稿

actorbug
actorbug

スコア2515

answer CHANGED
@@ -48,7 +48,7 @@
48
48
  return b
49
49
  ```
50
50
 
51
- とすれば、このように書ける。
51
+ とすれば、このように書ける。(先頭引数の型しか見ていないので注意)
52
52
  ```python
53
53
  func1(a1, a2)
54
54
  func1(b1, b2)

1

方法追加

2021/12/11 09:46

投稿

actorbug
actorbug

スコア2515

answer CHANGED
@@ -16,4 +16,42 @@
16
16
 
17
17
  ただし、該当のクラスが組み込み型など特殊なものだとできない。
18
18
  あと、事前に別名で関数として定義しなければならないので、名前付けの問題は残る。
19
- (直接ラムダ式を代入することもできるけど、ラムダ式だとできることが限られる)
19
+ (直接ラムダ式を代入することもできるけど、ラムダ式だとできることが限られる)
20
+
21
+
22
+ あと、[functools.singledispatch](https://docs.python.org/ja/3/library/functools.html#functools.singledispatch)を使う方法もある。
23
+ ```python
24
+ from functools import singledispatch
25
+
26
+ @singledispatch
27
+ def func1(arg1, arg2):
28
+ pass
29
+ @func1.register
30
+ def _(a1: modulea.TypeA, a2: modulea.TypeA) -> modulea.TypeA:
31
+ a = a1 + a2
32
+ return a
33
+ @func1.register
34
+ def _(b1: moduleb.TypeB, b2: moduleb.TypeB) -> moduleb.TypeB:
35
+ b = b1 + b2
36
+ return b
37
+
38
+ @singledispatch
39
+ def func2(arg1, arg2):
40
+ pass
41
+ @func2.register
42
+ def _(a1: modulea.TypeA, a2: modulea.TypeA) -> modulea.TypeA:
43
+ a = a1 - a2
44
+ return a
45
+ @func2.register
46
+ def _(b: moduleb.TypeB, b2: moduleb.TypeB) -> moduleb.TypeB:
47
+ b = b1 - b2
48
+ return b
49
+ ```
50
+
51
+ とすれば、このように書ける。
52
+ ```python
53
+ func1(a1, a2)
54
+ func1(b1, b2)
55
+ func2(a1, a2)
56
+ func2(b1, b2)
57
+ ```