LoginSignup
0
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-12-21

はじめに

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

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

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1