回答編集履歴

3 追記

LouiS0616

LouiS0616 score 31617

2018/05/02 15:46  投稿

こんな感じでしょうか。
> args = parser.parse_args()
0. コマンドライン引数をパースする
0. サブコマンドとしてhogeが指定されているので、hoge_parserにパースを委託する
0. それ以降は特にコマンドが指定されていないので、funcの値はデフォルト値になる
0. 結果が返ってきて、argsに保管される
> args.func(args)
0. argsには各属性が結び付いているので、args.funcはhoge
0. 引数にargsを指定しているのは現時点では無意味だと思う
 
`args.func is hoge`の真偽を見れば、二つが同一のオブジェクトを指していることが分かります。  
コメントを受けて
---
『結び付ける』処理自体は簡単に書けます。
```Python
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](https://wandbox.org/permlink/XnYdivpaqB7zltoE)
```
spam
ham
egg
```
こんな風に`set_default`を用いて属性を結び付けているのかと。
実際にはもっともっと複雑でしょうが、動作自体に違和感はありません。
2 追記

LouiS0616

LouiS0616 score 31617

2018/05/02 15:42  投稿

こんな感じでしょうか。
> args = parser.parse_args()
0. コマンドライン引数をパースする
0. サブコマンドとしてhogeが指定されているので、hoge_parserにパースを委託する
0. それ以降は特にコマンドが指定されていないので、funcの値はデフォルト値になる
0. 結果が返ってきて、argsに保管される
> args.func(args)
0. argsには各属性が結び付いているので、args.funcはhoge
0. 引数にargsを指定しているのは現時点では無意味だと思う
0. 引数にargsを指定しているのは現時点では無意味だと思う
コメントを受けて
---
『結び付ける』処理自体は簡単に書けます。
```Python
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](https://wandbox.org/permlink/XnYdivpaqB7zltoE)
```
spam
ham
egg
```
こんな風に`set_default`を用いて属性を結び付けているのかと。
実際にはもっともっと複雑でしょうが、動作自体に違和感はありません。
1 修正

LouiS0616

LouiS0616 score 31617

2018/05/02 15:21  投稿

こんな感じでしょうか。
> args = parser.parse_args()
0. コマンドライン引数をパースする
0. サブコマンドとしてhogeが指定されているので、hoge_parserにパースを委託する
0. それ以降は特にコマンドが指定されていないので、funcの値はデフォルト値になる
0. 結果が返ってきて、argsに保管される
> args.func(args)
0. argsには各属性が結び付いているので、args.funcはhoge

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る