質問: "__main__": main() ``` コマンドラインに"python test_argparse.py hoge"と入力すると関数hogeが呼ばれてhogeと返ってきます。公式ドキュメントを読みながら、どのようにコードが進行するか調べたのですが、最後の**args.func(args)**の挙動がわかりません。。。最終的にこの部分は**hoge()**となっているんだと思うんですが、どのように変化したのかわかりません。 初歩的な質問かと思いますが、お助けいただけると助かります。よろしくお願いいたします。
回答: こんな感じでしょうか。 > > args = parser.parse_args() > > > 1. コマンドライン引数をパースする 2. サブコマンドとしてhogeが指定されているので、hoge_parserにパースを委託する 3. それ以降は特にコマンドが指定されていないので、funcの値はデフォルト値になる 4. 結果が返ってきて、argsに保管される > > args.func(args) > > > 1. argsには各属性が結び付いているので、args.funcはhoge 2. 引数にargsを指定しているのは現時点では無意味だと思う `args.func is hoge`の真偽を見れば、二つが同一のオブジェクトを指していることが分かります。 コメントを受けて 『結び付ける』処理自体は簡単に書けます。 ``` class MyClass: def set_default(self, **kwargs): for key, value in kwargs.items(): setattr(self, key, value) def spam(): print('spam') def ham(): print('ham') def egg(): print('egg') obj = MyClass() obj.set_default(f_spam=spam, f_ham=ham, f_egg=egg) obj.f_spam() obj.f_ham() obj.f_egg() ``` **実行結果** Wandbox ``` spam ham egg ``` こんな風に`set_default`を用いて属性を結び付けているのかと。 実際にはもっともっと複雑でしょうが、動作自体に違和感はありません。