Python の argparse と shlex でコマンドライン以外の文字列解析に使う

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)