parse_args は文字列のリストを引数にとれます。
import argparse parser = argparse.ArgumentParser() parser.add_argument('name') parser.add_argument('--age', '-a', type=int) args = parser.parse_args(['Alice', '--age', '28']) print(args) # Namespace(name='Alice', age=28)
コマンドライン以外でも、Python の argparse を文字列の解析に使えます。例えば
import argparse def parse_text(text: str): parser = argparse.ArgumentParser() parser.add_argument('name') parser.add_argument('--age', '-a', type=int) items = text.split(' ') return parser.parse_args(items) args = parse_text('Alice --age 28') print(args) # Namespace(name='Alice', age=28)
といった関数もつくれます。
shlex
しかしこのままでは、半角スペースを含む引数に対応できません。
import argparse def parse_text(text: str): parser = argparse.ArgumentParser() parser.add_argument('name') parser.add_argument('--age', '-a', type=int) items = text.split(' ') return parser.parse_args(items) args = parse_text('"Alice in Wonderland" --age 28') print(args) # error: unrecognized arguments: in Wonderland"
shlex ライブラリの split はダブルクォーテーションなどを含む文字列を正確に分割します。
import argparse import shlex def parse_text(text: str): parser = argparse.ArgumentParser() parser.add_argument('name') parser.add_argument('--age', '-a', type=int) items = shlex.split(text) print(items) return parser.parse_args(items) args = parse_text('"Alice in Wonderland" --age 28') print(args) # ['Alice in Wonderland', '--age', '28'] # Namespace(name='Alice in Wonderland', age=28)