0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ArgumentParserで位置引数をオプションにするにはnargs='?'

Last updated at Posted at 2025-10-19
  • "--option" ("-o") のように "--"("-") で始まる引数は元からオプションの扱いのため default を指定するだけで省略時にデフォルト値が設定される
  • "--” で始まらない引数(位置引数)は必須の扱いであり、省略可能とするには (required=False ではなく) nargs='?' と default の指定が必要

正しい方法

  • nargs='?' を指定
  • default を指定 (指定しなかった場合はNoneになる)
argtest.py
import argparse

ap = argparse.ArgumentParser()

# --で始まらない引数は位置引数
ap.add_argument('posarg1', default='default-pos', nargs='?')

# defaultを指定しない位置引数
ap.add_argument('posarg2', nargs='?')

# --で始まる引数はオプション引数
ap.add_argument('--optarg', default='default-option')

arg = ap.parse_args()

print(f'posarg1={arg.posarg1}')
print(f'posarg2={arg.posarg2}')
print(f'optarg={arg.optarg}')
実行結果
% python argtest.py 
posarg1=default-pos
posarg2=None
optarg=default-option

失敗した方法

  • default だけ指定してもデフォルト値は設定されずにヘルプが表示される
defaultだけを指定した場合
# --で始まらない引数は位置引数
ap.add_argument('posarg1', default='default-pos')
実行結果
% python argtest.py
usage: argtest.py [-h] [--optarg OPTARG] posarg1 [posarg2]
argtest2.py: error: the following arguments are required: posarg1
  • required=False を指定するとエラーになる
required=Falseを指定した場合
# --で始まらない引数は位置引数
ap.add_argument('posarg1', default='default-pos', required=False)
実行結果
% python argtest.py
Traceback (most recent call last):
  File "/Users/user1/source/argtest.py", line 6, in <module>
    ap.add_argument('posarg1', default='default-pos', required=False)
  File "/opt/homebrew/Cellar/python@3.12/3.12.3/Frameworks/Python.framework/Versions/3.12/lib/python3.12/argparse.py", line 1459, in add_argument
    kwargs = self._get_positional_kwargs(*args, **kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/Cellar/python@3.12/3.12.3/Frameworks/Python.framework/Versions/3.12/lib/python3.12/argparse.py", line 1575, in _get_positional_kwargs
    raise TypeError(msg)
TypeError: 'required' is an invalid argument for positionals

検証環境

% python -V
Python 3.12.3

% sw_vers 
ProductName:            macOS
ProductVersion:         15.7.1
BuildVersion:           24G231

参考記事

ArgumentParserを使ってpythonのコマンドライン引数をとことん使ってみた

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?