文字列を関数にマップするハッシュテーブルがあるとします。私の例では、それをCOMMANDS
と呼んでいます。私はそれを文字列にマップする(のがcmd_add
それを呼びましょう)後、ハッシュテーブル、いくつかの機能の定義を置き、その後、私はそれを起動しようとすると、私はエラーを取得する:関数のシンボルがPythonでバインドされるのはいつですか?前方宣言は可能ですか?
COMMANDS = {'add': cmd_add}
def cmd_add():
print 'ADD'
COMMANDS['add']()
# NameError: name 'cmd_add' is not defined
は今すぐことがわかり私は単にCOMMANDS
の定義の前に関数定義を移動した場合、それだけで罰金うまくいく:
def cmd_add():
print 'ADD'
COMMANDS = {'add': cmd_add}
COMMANDS['add']()
# NO ERROR!
なぜこれが本当ですか?私が理解していないPythonバインドについて何かありますか?
にそれを再バインドするまで、それはその関数を参照するとしてPythonバインディングを作成します - と'FunctionDeclaration'構造体と' var'構造体の前方参照を持っています。 (つまり、この答えはすべての動的言語に固有の性質ではないため、解明が必要です) –
ああ、ありがとう、最初の例がPythonicの観点からは意味をなさないことが分かりました。 – apc