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

回答編集履歴

1

未答だった箇所の追記

2021/11/17 14:12

投稿

attakei
attakei

スコア2740

answer CHANGED
@@ -1,3 +1,15 @@
1
+ ## 回答まとめ
2
+
3
+ > やはり関数の引数にkwargsが設定されているので、引数なしで動作するのはおかしい
4
+
5
+ 関数の引数として`**`が用いられている場合の一般的な挙動です
6
+
7
+ > 引数にkwargsを入れなくても、まったく同じcontextが返されます
8
+
9
+ 継承元内の同じメソッド内で`context`の構築のために`kwargs`を使っていないのであれば、同じとなることは十分ありえます
10
+
11
+ ## 「やはり関数の引数にkwargsが設定されているので、引数なしで動作するのはおかしい」について
12
+
1
13
  Pythonの関数・メソッド定義の仕様として、仮引数として`**kwargs`(kwargs自体は何でも可)を最後に指定しておくと「定義時に定義していない名前付き仮引数の全てを預かる`dict`」になります。
2
14
  ※[Pyhtonドキュメント](https://docs.python.org/ja/3/tutorial/controlflow.html#keyword-arguments)
3
15
  そのため、このような定義の仕方をした場合では、仮に引数指定がされてなかったら「中身がなにもない`dict`」として処理されます。
@@ -18,4 +30,30 @@
18
30
  func(world="hello")
19
31
  # None
20
32
  # {'world': 'hello'}
21
- ```
33
+ ```
34
+
35
+ ## 「引数にkwargsを入れなくても、まったく同じcontextが返されます」について
36
+
37
+ `super().get_context_data()`は親クラスのものを呼び出しているわけですが、
38
+ 継承元メソッドが返り値のために`kwargs`を使わないのであれば、`kwargs`に何が入っていようと無関係です。
39
+
40
+ 極端な例:
41
+
42
+ ```python
43
+ class A:
44
+ def func(self, **kargs):
45
+ print("Called A.func")
46
+ return {"name": "Alice"}
47
+
48
+ class B(A):
49
+ def func(self, **kawrgs):
50
+ # A.funcは{"name": "Alice"}を返すだけなので、
51
+ # 引数に何を入れてもdataは{"name": "Alice"}
52
+ data = super().func()
53
+ print("Called B.func")
54
+ return data
55
+ ```
56
+
57
+ 質問文内のコードでは何を継承しているかまでは不明ですが、`kwargs`を引き渡してようといまいと同じ内容が返ってくるということであれば、そういうことなのでしょう。
58
+
59
+ ※あくまで、返り値を組み立てる際に`kwargs`を使っていないという想像が出来るだけです。クラスの他プロパティのためになにかしている可能性がありますし、オブジェクトの見かけ上は同じでも実態としては差異が存在することもあります。