回答編集履歴

1

未答だった箇所の追記

2021/11/17 14:12

投稿

attakei
attakei

スコア2740

test CHANGED
@@ -1,3 +1,27 @@
1
+ ## 回答まとめ
2
+
3
+
4
+
5
+ > やはり関数の引数にkwargsが設定されているので、引数なしで動作するのはおかしい
6
+
7
+
8
+
9
+ 関数の引数として`**`が用いられている場合の一般的な挙動です
10
+
11
+
12
+
13
+ > 引数にkwargsを入れなくても、まったく同じcontextが返されます
14
+
15
+
16
+
17
+ 継承元内の同じメソッド内で`context`の構築のために`kwargs`を使っていないのであれば、同じとなることは十分ありえます
18
+
19
+
20
+
21
+ ## 「やはり関数の引数にkwargsが設定されているので、引数なしで動作するのはおかしい」について
22
+
23
+
24
+
1
25
  Pythonの関数・メソッド定義の仕様として、仮引数として`**kwargs`(kwargs自体は何でも可)を最後に指定しておくと「定義時に定義していない名前付き仮引数の全てを預かる`dict`」になります。
2
26
 
3
27
  ※[Pyhtonドキュメント](https://docs.python.org/ja/3/tutorial/controlflow.html#keyword-arguments)
@@ -39,3 +63,55 @@
39
63
  # {'world': 'hello'}
40
64
 
41
65
  ```
66
+
67
+
68
+
69
+ ## 「引数にkwargsを入れなくても、まったく同じcontextが返されます」について
70
+
71
+
72
+
73
+ `super().get_context_data()`は親クラスのものを呼び出しているわけですが、
74
+
75
+ 継承元メソッドが返り値のために`kwargs`を使わないのであれば、`kwargs`に何が入っていようと無関係です。
76
+
77
+
78
+
79
+ 極端な例:
80
+
81
+
82
+
83
+ ```python
84
+
85
+ class A:
86
+
87
+ def func(self, **kargs):
88
+
89
+ print("Called A.func")
90
+
91
+ return {"name": "Alice"}
92
+
93
+
94
+
95
+ class B(A):
96
+
97
+ def func(self, **kawrgs):
98
+
99
+ # A.funcは{"name": "Alice"}を返すだけなので、
100
+
101
+ # 引数に何を入れてもdataは{"name": "Alice"}
102
+
103
+ data = super().func()
104
+
105
+ print("Called B.func")
106
+
107
+ return data
108
+
109
+ ```
110
+
111
+
112
+
113
+ 質問文内のコードでは何を継承しているかまでは不明ですが、`kwargs`を引き渡してようといまいと同じ内容が返ってくるということであれば、そういうことなのでしょう。
114
+
115
+
116
+
117
+ ※あくまで、返り値を組み立てる際に`kwargs`を使っていないという想像が出来るだけです。クラスの他プロパティのためになにかしている可能性がありますし、オブジェクトの見かけ上は同じでも実態としては差異が存在することもあります。