呼び出し (call) は、呼び出し可能オブジェクト (callable object, 例えば 関数など) を、引数列とともに呼び出します。引数列は空のシーケンスでも かまいません:
call | ::= | primary "(" [argument_list [","]] ")" |
argument_list | ::= | positional_arguments ["," keyword_arguments] |
["," "*" expression] | ||
["," "**" expression] | ||
| keyword_arguments ["," "*" expression] | ||
["," "**" expression] | ||
| "*" expression ["," "**" expression] | ||
| "**" expression | ||
positional_arguments | ::= | expression ("," expression)* |
keyword_arguments | ::= | keyword_item ("," keyword_item)* |
keyword_item | ::= | identifier "=" expression |
固定引数やキーワード引数の後ろにカンマをつけてもかまいません。 構文の意味付けに影響を及ぼすことはありません。
一次語の値評価結果は、呼び出し可能オブジェクトでなければなりません (ユーザ定義関数、組み込み関数、組み込みオブジェクトのメソッド、 クラスオブジェクト、クラスインスタンスのメソッド、そして特定の クラスインスタンス自体が呼び出し可能です; 拡張によって、 その他の呼び出し可能オブジェクト型を定義することができます)。 引数式は全て、呼び出しを試みる前に値評価されます。 仮引数 (formal parameter) リストの構文については、7.6 を参照してください。
キーワード引数が存在する場合、以下のようにして最初に固定引数
(positional argument) に変換されます。まず、値の入っていない
スロットが仮引数に対して生成されます。N 個の固定引数が
ある場合、固定引数は先頭の N スロットに配置されます。
次に、各キーワード引数について、識別子を使って対応するスロット
を決定します (識別子が最初の仮引数パラメタ名と同じなら、最初の
スロットを使う、といった具合です)。スロットがすでにすべて埋まって
いたなら、TypeError 例外が送出されます。
それ以外の場合、引数値をスロットに埋めていきます。
(式が None
であっても、その式でスロットを埋めます)。
全ての引数が処理されたら、まだ埋められていないスロットをそれぞれに
対応する関数定義時のデフォルト値で埋めます。(デフォルト値は、
関数が定義されたときに一度だけ計算されます; 従って、リストや
辞書のような変更可能なオブジェクトがデフォルト値として使われると、
対応するスロットに引数を指定しない限り、このオブジェクトが全ての
呼び出しから共有されます; このような状況は通常避けるべきです。)
デフォルト値が指定されていない、値の埋められていないスロットが
残っている場合、TypeError 例外が送出されます。
そうでない場合、値の埋められたスロットからなるリストが呼び出しの
引数として使われます。
仮引数スロットの数よりも多くの固定引数がある場合、構文 "*identifier" を使って指定された仮引数がないかぎり、 TypeError 例外が送出されます; 仮引数 "*identifier" がある場合、 この仮引数は余分な固定引数が入ったタプル (もしくは、余分な 固定引数がない場合には空のタプル) を受け取ります。
キーワード引数のいずれかが仮引数名に対応しない場合、構文 "**identifier" を使って指定された仮引数がない限り、 TypeError 例外が送出されます; 仮引数 "**identifier" がある場合、 この仮引数は余分なキーワード引数が入った (キーワードをキーとし、 引数値をキーに対応する値とした) 辞書を受け取ります。 余分なキーワード引数がない場合には、空の (新たな) 辞書を 受け取ります。
関数呼び出しの際に "*expression" 構文が使われる場合、 "expression" の値評価結果はシーケンスでなくてはなりません。 このシーケンスの要素は、追加の固定引数のように扱われます; すなわち、固定引数 x1,...,xN と、 y1,...,yM になるシーケンス "expression" を使った 場合、M+N 個の固定引数 x1,...,xN,y1,...,yM を使った呼び出しと同じになります。
上記の仕様による結果として、"*expression" 構文は たとえキーワード引数 以降に あっても、キーワード引数 以前に ("**expression" 引数があればさらにその後に - 下記参照) 処理されます。従って:
>>> def f(a, b): ... print a, b ... >>> f(b=1, *(2,)) 2 1 >>> f(a=1, *(2,)) Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: f() got multiple values for keyword argument 'a' >>> f(1, *(2,)) 1 2
となります。
キーワード引数と "*expression" 構文を同じ呼び出しに使うことは あまりないので、実質的には上記のような混乱が生じることはありません。
関数呼び出しで "**expression" 構文が使われた場合、 "expression" の値評価結果は辞書 (またはそのサブクラス) で なければなりません。辞書の内容は追加のキーワード引数として扱われ ます。明示的なキーワード引数が "expression" 内のキーワード と重複した場合には、TypeError 例外が送出されます。
"*identifier" や "**identifier" 構文を使った仮引数は、 固定引数スロットやキーワード引数名にすることができません。 "(sublist)" 構文を使った仮引数は、キーワード引数名には 使えません; sublist は、リスト全体が一つの無名の引数スロット に対応しており、sublist 中の引数は、他の全てのパラメタに対する 処理が終わった後に、通常のタプル形式の代入規則を使ってスロットに 入れられます。
呼び出しを行うと、例外を送出しない限り、常に何らかの値を返します。
None
を返す場合もあります。戻り値がどのように算出されるかは、
呼び出し可能オブジェクトの形態によって異なります。
呼び出し可能オブジェクトが。。。
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。