回答まとめ
やはり関数の引数にkwargsが設定されているので、引数なしで動作するのはおかしい
関数の引数として**
が用いられている場合の一般的な挙動です
引数にkwargsを入れなくても、まったく同じcontextが返されます
継承元内の同じメソッド内でcontext
の構築のためにkwargs
を使っていないのであれば、同じとなることは十分ありえます
「やはり関数の引数にkwargsが設定されているので、引数なしで動作するのはおかしい」について
Pythonの関数・メソッド定義の仕様として、仮引数として**kwargs
(kwargs自体は何でも可)を最後に指定しておくと「定義時に定義していない名前付き仮引数の全てを預かるdict
」になります。
※Pyhtonドキュメント
そのため、このような定義の仕方をした場合では、仮に引数指定がされてなかったら「中身がなにもないdict
」として処理されます。
よって、「引数なしで動作するのはおかしい」ということはなく、Pythonのコードとして正しく動作しています。
下のようなコードで試すと多少理解が進むのではないでしょうか
python
1def func(hello=None, **kwargs):
2 print(hello)
3 print(kwargs)
4
5func()
6# None
7# {}
8func(hello="world")
9# world
10# {}
11func(world="hello")
12# None
13# {'world': 'hello'}
「引数にkwargsを入れなくても、まったく同じcontextが返されます」について
super().get_context_data()
は親クラスのものを呼び出しているわけですが、
継承元メソッドが返り値のためにkwargs
を使わないのであれば、kwargs
に何が入っていようと無関係です。
極端な例:
python
1class A:
2 def func(self, **kargs):
3 print("Called A.func")
4 return {"name": "Alice"}
5
6class B(A):
7 def func(self, **kawrgs):
8 # A.funcは{"name": "Alice"}を返すだけなので、
9 # 引数に何を入れてもdataは{"name": "Alice"}
10 data = super().func()
11 print("Called B.func")
12 return data
質問文内のコードでは何を継承しているかまでは不明ですが、kwargs
を引き渡してようといまいと同じ内容が返ってくるということであれば、そういうことなのでしょう。
※あくまで、返り値を組み立てる際にkwargs
を使っていないという想像が出来るだけです。クラスの他プロパティのためになにかしている可能性がありますし、オブジェクトの見かけ上は同じでも実態としては差異が存在することもあります。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/15 22:35
2021/11/30 12:42