Python の課題で、次の 2 つの関数を作成する必要がありました。
move(board, move)
undomove(board, move)
関数と同じ名前の引数を持つことは、私には悪い習慣のように思えます。私はすでに教授に連絡して変更しましたが、好奇心move
から、 内から関数を呼び出しundomove
たり、 で再帰を使用したりすることは可能move
ですか? これらの関数内でmove
、引数を参照します。
(問題がある場合は Python 3)
Python の課題で、次の 2 つの関数を作成する必要がありました。
move(board, move)
undomove(board, move)
関数と同じ名前の引数を持つことは、私には悪い習慣のように思えます。私はすでに教授に連絡して変更しましたが、好奇心move
から、 内から関数を呼び出しundomove
たり、 で再帰を使用したりすることは可能move
ですか? これらの関数内でmove
、引数を参照します。
(問題がある場合は Python 3)
(機能) を理解することはできますが、move
追加の体操が必要になります。
def move(move):
print(move,"inside move")
def undomove(move):
print (move,"inside undomove")
this_mod =__import__(__name__)
this_mod.move(move)
if __name__ == '__main__':
move(1)
undomove(2)
ただし、一般的には、その関数で必要になる関数と同じ名前のローカル変数に名前を付けることは絶対に避けます。
スタイルに関する限り、関数を作成することdef move(move): ...
は間違いなく少し奇妙であり、カジュアルな読者は再帰関数を記述しようとしていると思われるため、それは絶対に避けます。undomove(move)
whenがモジュール スコープで既に関数として定義されていると書くmove
と少し奇妙になりますが、一見すると混乱を招く可能性があります (ローカル変数ですか? 関数ですか?)。 .
ここにはいくつかのオプションがありますが、最も単純なもの (名前の変更move
) を除外して、他にもいくつかあります。
まず、関数に別の名前を作成して、move
オーバーライドされたときにそれを使用できるようにすることができます。
def move(...):
...
move_ = move
def undomove(..., move):
move_(...)
これは、Python の関数が他のオブジェクトと同様に機能するため、関数を変数に割り当てるだけで機能します。
別のオプションは、関数をクラスに配置することです。つまり、関数は名前空間にあります。つまり、メソッドに としてアクセスしself.move()
、パラメーターに としてアクセスしますmove
。とはいえ、割り当てで関数がトップレベルである必要がある場合、それはオプションではありません。
内部(または他の関数)からmove
呼び出すことで、関数に到達できます。あまりエレガントではありません...globals()['move']
undomove