Muji Blog

いろんなトピックを備忘録的に発信していきます。トピック例:{画像処理、信号処理、心理学}

python OptionParserにゼロ埋め整数値を入れようとして引っかかった話

OptionParserとは

コマンドラインオプションの解析器です。
https://docs.python.org/ja/3/library/optparse.html

以下のようなコマンドを叩くと、pythonのバージョン情報が表示されるかと思います。

python --version

このときの"--version"がオプション引数で、カスタマイズすることができます。

引数の型は"int"、"string"、"float"、"complex"などを指定できます。

今回引っかかった話

画像や音声など、何らかの処理をしてファイルを保存していきたいとき、こういったオプション引数やコマンドライン引数で保存ファイル名を指定するようなこともあるかと思います。
その時、動画や音声のフレームの番号にあたる番号をゼロ埋めで表示してファイル名に指定することもあるかと思います。

実は、上のページ内にもありますが、OptionParserでは、ゼロで始まる値をint型で引数に取ると8進数の値として扱われてしまいます。

以下に、オプションを設定する実装例を紹介します。

#test_parse.py
from optparse import OptionParser

parser = OptionParser()
parser.add_option("-i", "--input_int", dest="input_int", help="set input (int)", metavar="INPUT_INT", type="int")
parser.add_option("-s", "--input_str", dest="input_str", help="set input (str)", metavar="INPUT_STR")

(opt, args) = parser.parse_args()

print("parse int : ", opt.input_int)
print("parse_str : ", opt.input_str)
print(" -> cast int : ", int(opt.input_str))

このスクリプトに対し、以下のように実行します。

python test_parse.py -i 012 -s 012

そうすると、以下のように表示され、確かにint型にしてある"-i"オプションは期待した値とは違う値が出力されます。

parse int :  10
parse_str :  012
 -> cast int :  12

その他入力を変えて実行していくと確認できますが、確かにint型に対して0埋めの値を入力すると8進数に変換されてしまうようです。

OptionParserを使用する際に知っておいて損はない話かと思いますので、記録しておきます。