Address
304 North Cardinal St.
Dorchester Center, MA 02124

Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM

how to use asteriks argument in a funciton in python

Pythonの関数の引数にアスタリスクを使った「関数 (~,*,・・・)」の意味とは?

Pythonの関数の引数において使われる「*」の意味とその使い方についての解説

「*」記号は、アスタリスクと呼ばれたりしますが、Python公式ドキュメントではよく「starred~」という言葉で表現されています。星印なので、starというわけですね。

さて、Pythonの関数では、この「*」が引数の中に使われていることがよくあります。よく使われる態様は主に次の2種類に大別されます。

A可変長位置引数(よく「*args」と書かれる)または可変長キーワード引数(よく「**kwarg」と書かれる)で使われるもの
B「*」それ単独で使われるもの

このうちAの場合の使い方については「Pythonの引数*args, **kwargsとは?その解説」で解説しています。

そこで今回はBの場合の使い方について解説します。

Pythonの関数の引数における「~,*, ・・・」の意味とは?

要点その1

今、仮に次のような6つの仮引数を取る関数を定義したとします。

def 関数(引数1, 引数2, 引数3, *, 引数4, 引数5, 引数6):
   略

続いて公式ドキュメントにおける次の説明をみてください。

  • キーワード専用: キーワードによってのみ与えられる引数を指定します。キーワード専用の引数を定義できる場所は、例えば以下の kw_only1 や kw_only2 のように、関数定義の仮引数リストに含めた可変長位置引数または裸の * の後です:

def func(arg, *, kw_only1, kw_only2): …

Python公式ドキュメント

今回は「*」についてだけの解説なので、上の説明の中の「*」についてだけに注目して言えば、

def 関数(引数1, 引数2, 引数3, *, 引数4, 引数5, 引数6):
   略

関数定義がこのようになっていれば、*の後に続く引数4、引数5、引数6は全てキーワード引数でなければならないということです。

では次にもう1つのポイントを見ていきましょう。

要点その2

次の公式説明を見てください。

1 つ以上の 仮引数 が parameter = expression の形を取っているとき、関数は “デフォルト引数値” を持つと言います。デフォルト値を持つ仮引数では、呼び出し時にそれに対応する 実引数 は省略でき、その場合は仮引数のデフォルト値が使われます。ある引数がデフォルト値を持っている場合、それ以降 “*” が出てくるまでの引数は全てデフォルト値を持っていなければなりません — これは文法定義では表現されていない構文的制限です。

Python公式ドキュメント

要点その1よりもちょっとわかりにくい文章になっています。これについて下の関数の例で説明しましょう。

def 関数(引数1, 引数2, 引数3, *, 引数4, 引数5, 引数6):
   略

このうち「*」の前の引数について、たとえば引数2がデフォルトの値をもつキーワード引数の形になっているとします。引数2を少し書き換えて、次のようにします。

def 関数(引数1, par=None, 引数3, *, 引数4, 引数5, 引数6):
   略

この場合は、「par=None」から「*」までの引数、つまり「par=None」だけでなく引数3も、必ずデフォルトの値をもつキーワード引数でなければならないという意味です。

たとえばこんな形です。

def 関数(引数1, par=None, txt="Tom", *, 引数4, 引数5, 引数6):
   略

あくまで「*」の前の引数に、「デフォルト値が設定されているキーワード引数」があることが前提というのがポイントですね。

では最後に具体例をみてみましょう。

具体例

class subprocess.Popen(args, bufsize=- 1, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=True, shell=False, cwd=None, env=None, universal_newlines=None, startupinfo=None, creationflags=0, restore_signals=True, start_new_session=False, pass_fds=(), *, group=None, extra_groups=None, user=None, umask=- 1, encoding=None, errors=None, text=None, pipesize=- 1, process_group=None)

このクラスの定義を見てください。その中に「*」があるのがわかると思います。

まず上の「要点その1」で説明したように、「*」のあとは全てキーワード引数の形になっていなければなりません。上のクラス定義はまさにそうなっています。

また、「*」の前には、デフォルト値が設定されているキーワード引数がいろいろあります。その最初は、「 bufsize=- 1」という仮引数の項目です。

そして上の「要点その2」によって、この「bufsize=- 1」から「*」の直前「pass_fds=()」までは、全て「デフォルト値が設定されているキーワード引数」でなければなりません。よって、上のクラス定義もそのようになっています。