Pythonでコマンドライン引数の型を指定する(argparse編)

Pythonのargparseモジュールによるコマンドライン引数の取得で、取得した引数の型変換をします。

目次

  1. argparseモジュールとは
  2. コマンドライン引数の型を変換する

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として扱われるので、これで使えますね。

広告

Pythonのコマンドライン引数カテゴリの投稿