argsとkwargs とは?「可変長引数」を正しく理解しよう!

公開日: 2026-04-19

Pythonのコードを読んでいると、関数の引数部分に *args**kwargs という不思議な記述が出てくることがあります。

初心者の方にとっては、このアスタリスク記号が何を意味しているのか分からず、少し怖く感じてしまうかもしれません。

しかし、この仕組みは「可変長引数」と呼ばれる非常に便利な機能であり、使いこなせるとコードの柔軟性が一気に高まります。 今回は、エンジニア歴10年の視点から、これらが一体何者なのか、そして現場でどう使われているのかを分かりやすく解説します。

そもそも可変長引数とは何なのか

プログラミングにおける引数とは、関数に渡す情報のことを指しますが、通常はその個数が決まっています。 一方で、状況によって渡したいデータの数が変わる場合、あらかじめ個数を固定してしまうと不便なことがあります。

そんなときに活躍するのが、引数の数を自由に決めることができる「可変長引数」という仕組みです。 まずは、なぜこの機能が必要なのか、その根本的な理由から紐解いていきましょう。

引数の数が決まっていないメリット

例えば、複数の数字をすべて足し合わせる関数を作ると想像してみてください。 2つの数字だけなら add(a, b) で良いですが、3つ、10個、あるいは100個と増えた場合、その都度引数を増やすのは現実的ではありません。

可変長引数を使えば、1つの関数で「何個でもデータを受け取れる」という魔法のような処理が可能になります。 これによって、呼び出し側は自由にデータを渡せるようになり、コードの再利用性が劇的に向上するのです。

args と kwargs という名前に決まりはある?

実は、argskwargs という単語自体は、Pythonの言語仕様で決まっている厳格なルールではありません。 重要なのはその前についているアスタリスク(*)の数であり、名前自体は *numbers**options としても動作します。

しかし、世界中のエンジニアが慣習的にこの名前を使っているため、特別な理由がない限りは argskwargs を使うのがマナーです。 他の人が読んだときに「ああ、可変長引数を使っているな」と一目で理解してもらえるからです。

【関連記事】 綺麗なコードって何?初心者から一歩抜け出す「リーダブルコード」の3つの基本

*args(アスタリスク1つ)の正体

まずはアスタリスクが1つの *args から詳しく見ていきましょう。 これは、複数の引数を「タプル」という箱にまとめて受け取るための仕組みです。

渡されたデータは、関数内部では一つのまとまりとして扱われるため、ループ処理などで簡単に加工することができます。 具体的なイメージを掴むために、以下の説明とサンプルコードを確認してみましょう。

args の動作イメージと使い方

関数を呼び出す際、カンマ区切りで渡されたバラバラのデータが、関数の入り口で args という名前のタプルにギュッと凝縮されます。 これをプログラミング用語では「パッキング(梱包)」と呼ぶこともあります。

def greet_all(*args):
    # args はタプルとして扱われる
    for name in args:
        print(f"こんにちは、{name}さん!")

# 何人渡してもOK
greet_all("田中", "佐藤", "鈴木")

この例では、3人の名前を渡していますが、関数の定義側では *args と書くだけで全員分を受け取れています。 もし100人の名前を渡したとしても、この関数は一切修正することなく正しく動作し続けます。

リストをバラして渡す「アンパッキング」

逆に、すでにリストとして持っているデータを、バラバラにして関数に渡したいときもアスタリスクが役立ちます。 これを「アンパッキング(開梱)」と呼び、関数の呼び出し側でアスタリスクを付けます。

members = ["田中", "佐藤", "鈴木"]

# リストの前に * をつけると、バラバラに展開して渡せる
greet_all(*members)

このように、* は「まとめる」ときと「バラす」とき、どちらの場面でも活躍する便利な記号なのです。 タプルやリストの扱いを理解しておくと、この仕組みの理解がさらに深まるでしょう。

**kwargs(アスタリスク2つ)の正体

次に、アスタリスクが2つ重なった **kwargs について解説します。 こちらは、引数を「キーワード付き」で、つまり「名前=値」という形式で受け取るための仕組みです。

args がタプルにまとめるのに対し、kwargs は「辞書(dictionary)」という形式にデータをまとめます。 これによって、単なるデータの羅列ではなく「どのデータが何を意味するか」をセットで管理できるようになります。

kwargs の便利なポイント

関数の呼び出し側で、自由な名前の引数を作って渡せることが最大の強みです。 例えば、ユーザーのプロフィール情報を受け取る関数を作る場合、人によって「住所」があったり「趣味」があったりと、情報の項目が異なることがあります。

def print_profile(**kwargs):
    # kwargs は辞書として扱われる
    for key, value in kwargs.items():
        print(f"{key}: {value}")

# 渡す項目が人によって違っても大丈夫
print_profile(name="田中", age=25, city="東京")
print_profile(name="佐藤", hobby="登山")

このように、関数側であらかじめ項目(引数名)を決めておかなくても、呼び出し側の都合でデータを詰め込めます。 柔軟な設定が必要なプラグインの開発や、大規模なシステムのインターフェースでよく使われる手法です。

args と kwargs の違いを比較表でチェック

2つの違いを整理するために、以下の比較表にまとめてみました。 どちらを使うべきか迷ったときは、この表を思い出してみてください。

項目 *args **kwargs
形式 位置引数(データの羅列) キーワード引数(名前=値)
受け取る型 タプル (tuple) 辞書 (dict)
主な用途 任意の数のデータを一括処理 任意の数の設定や属性を管理
呼び出し例 func(1, 2, 3) func(a=1, b=2)

つなぎの文章として、これら2つは同時に使うこともできるという点をお伝えします。 Pythonでは引数の並び順に厳格なルールがあるため、併用する際は注意が必要です。

【関連記事】 itertoolsを使いこなせ!複雑なループ処理を1行で美しく書くテクニック

引数を並べる順番には「絶対的なルール」がある

Pythonの関数では、普通の引数(位置引数)、*args**kwargs を混ぜて使うことができます。 ただし、その並び順を間違えると Python が「どれがどれだか分からない!」とエラーを出してしまいます。

正しい順番を守ることは、バグの少ない綺麗なコードを書くための基本中の基本です。 初心者が最も間違えやすいポイントですので、ここでしっかり確認しておきましょう。

守るべき並び順の正解

結論から言うと、以下の順番で記述しなければなりません。 この順番を崩すと、プログラムは実行前に「構文エラー(SyntaxError)」を吐いて止まってしまいます。

  1. 通常の引数(名前を固定したもの)
  2. *args(可変長の位置引数)
  3. **kwargs(可変長のキーワード引数)
def complete_func(arg1, *args, **kwargs):
    print(f"固定引数: {arg1}")
    print(f"args: {args}")
    print(f"kwargs: {kwargs}")

# 実行例
complete_func("必須", 1, 2, 3, option="有効")

もし **kwargs*args より先に書いてしまうと、Pythonは「キーワード引数の後に位置引数は置けません」と怒ってきます。 これは、プログラムが引数を左から順番に解析していく仕組みになっているためです。

デフォルト値を持つ引数がある場合は?

さらに応用として、a=10 のようなデフォルト値を持つ引数がある場合はどうなるでしょうか。 この場合は、通常の引数の直後、つまり *args よりも前に置くのが一般的です。

このように階層構造を意識することで、複雑な関数設計でも迷わなくなります。 一見複雑ですが、ルールはシンプルですので、一度体に覚えさせてしまえば怖くありません。

エンジニア歴10年の私から伝えたい「現場の知恵」

ここまで技術的な解説をしてきましたが、実は現場では *args**kwargs を「あえて使わない」という選択をすることも多々あります。 なぜなら、何でも受け取れるということは、裏を返せば「何を渡すべきかが分かりにくい」ということでもあるからです。

10年間の開発経験の中で私が学んだ、可変長引数と上手に付き合うための心得をお話しします。 プロの視点を取り入れて、より「使える」エンジニアを目指しましょう。

「何でも屋」は時に混乱を招く

新人の頃、私は「これを使えば将来どんなデータが増えても対応できる!」と思い、あらゆる関数を **kwargs で作っていた時期がありました。 しかし数ヶ月後、そのコードを読み返したときに後悔することになります。

「この関数、結局どんなデータを渡せば動くんだっけ?」と、自分でも分からなくなってしまったのです。 引数名が固定されていればエディタが補完してくれますが、可変長引数は中身を詳しく読まないと何が必要か見えません。

どんな場面で使うのが「正解」なのか

実務において *args**kwargs が最も輝くのは、主に以下の2つのパターンです。

  1. ラッパー関数(中継役)を作る場合 : 別の関数を呼び出すだけの関数を作る際、元の関数に引数をそのまま「横流し」するために使います。
  2. デコレータを作成する場合 : 関数の前後に共通の処理を追加する際、元の関数がどんな引数を持っていても壊さないようにするために必須となります。

逆に、明確に決まったデータを処理するだけの関数なら、面倒でも一つずつ引数名を定義すべきです。 「自由」と「分かりやすさ」のバランスを取ることこそが、エンジニアとしての真の腕の見せ所と言えるでしょう。

【関連記事】 Pythonのデコレータ(@)って何?関数の前後で処理を追加する不思議な記法の正体

よくある疑問:args はリストじゃダメなの?

勉強熱心な方なら、「わざわざ args なんて使わなくても、リストを一つ引数に渡せばいいんじゃない?」と思うかもしれません。

確かに、def func(data_list): と定義しても同じようなことは可能です。

しかし、可変長引数を使うことで「呼び出し側のコードが短くなる」という大きな利点があります。 リストを渡す場合は func([1, 2, 3]) とブラケットが必要ですが、可変長引数なら func(1, 2, 3) と直接書けます。

文法としての「意図」を伝える

また、リストを引数にする場合は「この関数はリストという構造そのものを必要としている」というニュアンスになります。 一方で *args を使う場合は「中身の個数はバラバラでいいから、とにかくデータをいくつか頂戴」という意図になります。

こうした細かいニュアンスの差が、大規模なプログラムを書く際の実装ミスを防ぐことにつながります。 Pythonの設計者がなぜこの機能をわざわざ用意したのかを考えると、使い分けの基準が見えてくるはずです。

まとめ

argskwargs は、正しく使えばコードを劇的にスッキリさせ、拡張性を高めてくれる魔法の杖です。 一方で、使いすぎると中身の見えないブラックボックスを作ってしまう危険性も秘めています。

まずは、ライブラリや他人のコードでこれらの記述を見たときに「ああ、あれね!」と理解できるようになることが第一歩です。 そして、自分のコードで「ここは引数の数が決まらないな」と思ったときに、そっと * を添えてみてください。

プログラミングの学習に近道はありませんが、こうした一つ一つの仕組みを丁寧に理解することで、確実にスキルは積み上がっていきます。

ここまでお読みいただきありがとうございました!

Pythonの基礎から応用まで学べる
Python WebAcademy

Python WebAcademyでは、Pythonの基礎からアーキテクチャなどの応用的な内容まで幅広く学べます。
また、ブラウザ上で直接Pythonコードを試すことができ、実践的なスキルを身につけることが可能です。

Pythonの学習を始める