1. ホーム
  2. python

[解決済み] なぜPythonは間違った数の引数で関数を呼び出すことができるのですか?

2023-08-25 03:43:16

質問

Pythonは私にとって初めての動的言語です。私は最近、間違った数の引数を供給する間違った関数呼び出しをコード化しました。これは、その関数が呼び出されたときに例外で失敗しました。私は、動的言語であっても、この種のエラーはソース ファイルが解析されたときに検出されることを期待しました。

というのは理解できるのですが は関数が呼び出されるまでわからないということは理解しています。なぜなら、同じ変数が異なる時点で任意の型の値を含む可能性があるからです。しかし の引数はソースファイルが解析されると同時に判明します。プログラムの実行中に変更されることはありません。

これが哲学的な質問でないように

Stack Overflow の範囲内でこれを維持するために、質問をこのように表現させてください。Python が提供する機能で、コードが実際に実行されるまで関数呼び出しの引数の数をチェックするのを遅らせる必要があるものがありますか?

どのように解決するのですか?

Pythonは、最終的にどのオブジェクトを呼び出すことになるかを前もって知ることができません。なぜなら、動的であるためです。 関数オブジェクトを交換する . いつでもです。そして、これらのオブジェクトはそれぞれ異なる数の引数を持つことができます。

以下は極端な例です。

import random

def foo(): pass
def bar(arg1): pass
def baz(arg1, arg2): pass

the_function = random.choice([foo, bar, baz])
print(the_function())

上記のコードは3分の2の確率で例外を発生させます。しかし、Pythonはそれが起こるかどうかを事前に知ることはできません!

そして、動的モジュールのインポート、動的関数の生成、他の呼び出し可能なオブジェクト(オブジェクトに __call__ メソッドを持つオブジェクトはすべて呼び出すことができます)、あるいはキャッチオール引数( *args**kwargs ).

しかし、これをさらに明確にするために、あなたは質問でこう述べています。

プログラムの実行中に変わることはありません。

Pythonではそうではありません。いったんモジュールがロードされると、関数オブジェクトを含むモジュール名前空間内のあらゆるオブジェクトを削除、追加、置換することができます。