[解決済み] なぜPythonは間違った数の引数で関数を呼び出すことができるのですか?
質問
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ではそうではありません。いったんモジュールがロードされると、関数オブジェクトを含むモジュール名前空間内のあらゆるオブジェクトを削除、追加、置換することができます。
関連
-
[解決済み] 最小限の驚き」と「変更可能なデフォルトの引数
-
[解決済み] Python 3で「1000000000000000 in range(1000000000000001)」はなぜ速いのですか?
-
[解決済み] Pythonでシングルトンを作成する
-
[解決済み] なぜPythonのコードは関数の中でより速く実行されるのですか?
-
[解決済み] Project Eulerとの速度比較。CとPythonとErlangとHaskellの比較
-
[解決済み] JavaScriptの関数への引数の数
-
[解決済み] オプションの引数を持つPython関数を作成するにはどうしたらいいですか?
-
[解決済み】Pythonで複数のコンストラクタを持つためのクリーンでPythonicな方法は何ですか?
-
[解決済み] リファレンス - このシンボルはPHPで何を意味するのですか?
-
[解決済み] subprocess.run()の出力を抑制またはキャプチャするには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Flaskで1時間ごとに関数を実行するようにスケジュールするには?
-
[解決済み] Python 2.7サポート終了?
-
[解決済み] Pandasの'Freq'タグにはどのような値が有効ですか?
-
[解決済み] 範囲指定された浮動小数点数のランダムな配列を生成します。
-
[解決済み] オブジェクトのリストに特定の属性値を持つオブジェクトが含まれているかどうかをチェックする
-
[解決済み] Ctrl-CでPythonスクリプトを終了できない
-
[解決済み] subprocess.run()の出力を抑制またはキャプチャするには?
-
[解決済み] Celeryタスクのユニットテストはどのように行うのですか?
-
[解決済み] Pythonの文字列の前にあるbという接頭辞は何を意味するのですか?
-
[解決済み] Pythonの辞書にあるスレッドセーフについて