Help us understand the problem. What is going on with this article?

【Python】**kwargs っぽくコマンドライン引数を処理する

はじめに

Pythonではコマンドライン引数のパースには標準ライブラリ argparse が使われます。
このライブラリはかなり高機能なので、しっかりしたアプリケーションを設計したい場面ならきっと便利に使えます。

しかし、毎回毎回そんなにしっかり設計できるものでもないです。
もともとコマンドライン引数を使わないスクリプトとして書き始めたのに、いつのまにか sys.argv があちこちに書かれているような人も多いのではないでしょうか。

ありがちな状況

# bad.py
import sys

foo = sys.argv[1]
bar = sys.argv[2]

print('foo ==', foo)
print('bar ==', bar)
$ python bad.py 12 34
foo == 12
bar == 34

これでは、引数で何を渡しているのか全くわかりません。
せめてPythonの関数でいうところの **kwargs みたいなものが欲しくなりますよね?

提案

# better.py

def arg(*flags, args=None, **kwargs):
    import argparse
    p = argparse.ArgumentParser()
    p.add_argument(*flags, **kwargs)
    ns, _ = p.parse_known_args(args)
    return next(getattr(ns, d) for d in dir(ns) if not d.startswith('_'))


foo = arg('--foo')
bar = arg('--bar')

print('foo ==', foo)
print('bar ==', bar)
$ python better.py --foo=12 --bar=34
foo == 12
bar == 34

いかがでしょう、ちょっとはマシになったんじゃないでしょうか。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away