親関数を返す-スーパーリターン?
質問
関数の後続の各ステップの後に実行する必要があるチェックがあるため、そのステップを関数内の関数として定義したかった
>>> def gs(a,b):
... def ry():
... if a==b:
... return a
...
... ry()
...
... a += 1
... ry()
...
... b*=2
... ry()
...
>>> gs(1,2) # should return 2
>>> gs(1,1) # should return 1
>>> gs(5,3) # should return 6
>>> gs(2,3) # should return 3
では、どうすればry内からgsに「a」を返すようにできますか? superを使用することを考えましたが、それはクラス専用だと思います。
ありがとう
少し混乱がありました... a == bの場合にのみaを返します。 a!= bの場合、gsがまだ何も返さないようにします。
編集:デコレーターが最適なソリューションかもしれません。
解決
これにより、aとbが同じになった場合、状態をチェックし続け、外側の関数から戻ることができます:
def gs(a,b):
class SameEvent(Exception):
pass
def ry():
if a==b:
raise SameEvent(a)
try:
# Do stuff here, and call ry whenever you want to return if they are the same.
ry()
# It will now return 3.
a = b = 3
ry()
except SameEvent as e:
return e.args[0]
他のヒント
という意味ですか?
def gs(a,b):
def ry():
if a==b:
return a
return ry()
「ステップ」に言及したとおり関数では、ほとんどジェネレーターが必要なようです:
def gs(a,b):
def ry():
if a==b:
yield a
# If a != b, ry does not "generate" any output
for i in ry():
yield i
# Continue doing stuff...
yield 'some other value'
# Do more stuff.
yield 'yet another value'
(ジェネレーターは、Python 2.5以降、を使用して、コルーチンとしても機能できるようになりました。新しいyield構文。)
少し混乱がありました...私は a == bの場合にのみaを返します。もし a!= bの場合、gsに戻りたくない まだ何でも。
それを確認してから:
def gs(a,b):
def ry():
if a==b:
return a
ret = ry()
if ret: return ret
# do other stuff
単に呼び出すのではなく、明示的にry()を返します。
同様の問題がありましたが、呼び出しの順序を変更するだけで解決しました。
def ry ()
if a==b
gs()
javascriptのような一部の言語では、関数の変数として関数を渡すこともできます。
function gs(a, b, callback) {
if (a==b) callback();
}
gs(a, b, ry);
所属していません StackOverflow