Pythonでコマンドライン引数の型を指定する(argparse編)
Pythonのargparseモジュールによるコマンドライン引数の取得で、取得した引数の型変換をします。
目次
argparseモジュールとは
argparseモジュールは、Pythonのスクリプトのコマンドライン引数を設定する便利モジュールです。使い方は 以前の投稿 を参照してください。
コマンドライン引数の型を変換する
argparseモジュールは、パーサーがコマンドライン引数を取得してからオブジェクトに格納するときに、指定の型に変換する機能を持っています。今回はその機能を試してみます。
ArgumentParser.add_argument(name, [action], [nargs], [const], [default], [type], [choices], [required], [help], [metavar], [dest])
変数 |
型 |
内容 |
---|---|---|
name |
str,list |
引数の名前、またはそのリスト。 |
action |
str |
省略可。既定値はstore。引数が存在したときのアクション。 |
nargs |
int,str |
省略可。受け取るべき引数の数。 |
const |
省略可。既定値はNone。actionとnargsに利用される定数。 |
|
default |
省略可。既定値はNone。引数が指定されなかったときの既定値。 |
|
type |
省略可。引数を変換する型。 |
|
choices |
省略可。引数として許容できる範囲。 |
|
required |
bool |
省略可。既定値はFalse。引数を省略可能かどうか。 |
help |
str |
省略可。引数の説明。 |
metavar |
str |
省略可。既定値は、位置引数の場合は名前。オプショナル引数の場合は名前を大文字に変換したもの。ヘルプで表示される引数の名前。 |
dest |
str |
省略可。既定値はnameから接頭辞を削除したもの。パースしたときのプロパティ名。 |
typeに型を指定します。
いろいろ試してみましょう。
まず、typeを指定しない場合です。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--hoge')
parser.add_argument('--piyo', default='string')
args = parser.parse_args()
print('引数 hoge : ', args.hoge, type(args.hoge))
print('引数 piyo : ', args.piyo, type(args.piyo))
いろいろ入力してみます。
>python argtry.py
引数 hoge : None <class 'NoneType'>
引数 piyo : string <class 'str'>
>python argtry.py --hoge moji
引数 hoge : moji <class 'str'>
引数 piyo : string <class 'str'>
>python argtry.py --hoge True --piyo False
引数 hoge : True <class 'str'>
引数 piyo : False <class 'str'>
>python argtry.py --hoge 123 --piyo 456
引数 hoge : 123 <class 'str'>
引数 piyo : 456 <class 'str'>
>python argtry.py --hoge 1.23 --piyo 4.56
引数 hoge : 1.23 <class 'str'>
引数 piyo : 4.56 <class 'str'>
引数無しのときのNone以外は、全てstrになってますね。
整数を指定してみましょう。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--hoge', type=int)
parser.add_argument('--piyo', default=456)
args = parser.parse_args()
print('引数 hoge : ', args.hoge, type(args.hoge))
print('引数 piyo : ', args.piyo, type(args.piyo))
>python argtry.py --hoge 123
引数 hoge : 123 <class 'int'>
引数 piyo : 456 <class 'int'>
>python argtry.py --hoge 123 --piyo 456
引数 hoge : 123 <class 'int'>
引数 piyo : 456 <class 'str'>
>python argtry.py --hoge 123.0
usage: argtry.py [-h] [--hoge HOGE] [--piyo PIYO]
argtry.py: error: argument --hoge: invalid int value: '123.0'
piyoのところですが、defaultをintにしたところdefaultが適用される場合はargsにintで格納されます。
ところが、コマンドライン引数でpiyoが入力されるとstrになってしまいます。つまりdefaultの指定があってもstr以外に変換したい場合はtypeを指定する必要があるということです。
typeがintのhogeに123.0という小数を入力したところ、エラーになりました。型が合わないとエラーになります。
では、floatで試してみます。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--hoge', type=float)
parser.add_argument('--piyo', type=float, default='456')
args = parser.parse_args()
print('引数 hoge : ', args.hoge, type(args.hoge))
print('引数 piyo : ', args.piyo, type(args.piyo))
>python argtry.py
引数 hoge : None <class 'NoneType'>
引数 piyo : 456.0 <class 'float'>
>python argtry.py --hoge 123.0 --piyo 456.0
引数 hoge : 123.0 <class 'float'>
引数 piyo : 456.0 <class 'float'>
>python argtry.py --hoge 123 --piyo 456
引数 hoge : 123.0 <class 'float'>
引数 piyo : 456.0 <class 'float'>
intはfloatに変換されるのですね。
では、boolで試してみましょう。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--hoge', type=bool)
parser.add_argument('--piyo', type=bool, default=False)
args = parser.parse_args()
print('引数 hoge : ', args.hoge, type(args.hoge))
print('引数 piyo : ', args.piyo, type(args.piyo))
>python argtry.py
引数 hoge : None <class 'NoneType'>
引数 piyo : False <class 'bool'>
>python argtry.py --hoge True --piyo True
引数 hoge : True <class 'bool'>
引数 piyo : True <class 'bool'>
>python argtry.py --hoge False --piyo False
引数 hoge : True <class 'bool'>
引数 piyo : True <class 'bool'>
あれ、Falseを入力してるのにTrueになってしまっています。defaultがFalseのときはFalseなので、Falseという文字列からの型変換がうまくいっていないようですね。
型変換にbool()という組み込み関数を使用しているらしいのですが、これの真偽値の判定基準を見てみましょう。偽と判定される条件です。
偽であると定義されている定数: None と False
数値型におけるゼロ: 0, 0.0, 0j, Decimal(0), Fraction(0, 1)
空のシーケンスまたはコレクション: '', (), [], {}, set(), range(0)
ということで、'False'という文字列を渡すとTrueと判定されるわけですね。
そこで、文字列の内容から真偽値を判定するstrtoboolという関数を使ってみます。
import argparse
from distutils.util import strtobool
parser = argparse.ArgumentParser()
parser.add_argument('--hoge', type=strtobool)
parser.add_argument('--piyo', type=strtobool, default=False)
args = parser.parse_args()
print('引数 hoge : ', args.hoge, type(args.hoge))
print('引数 piyo : ', args.piyo, type(args.piyo))
>python argtry.py
引数 hoge : None <class 'NoneType'>
引数 piyo : False <class 'bool'>
>python argtry.py --hoge True --piyo True
引数 hoge : 1 <class 'int'>
引数 piyo : 1 <class 'int'>
>python argtry.py --hoge False --piyo False
引数 hoge : 0 <class 'int'>
引数 piyo : 0 <class 'int'>
型がintになり、Trueのとき1が、Falseのとき0が格納されました。
intを真偽値判定に使うときに、0はFalse、1はTrueとして扱われるので、これで使えますね。
公開日
広告