есть проверка, которую мне нужно выполнять после каждого последующего шага в функции, поэтому я хотел определить этот шаг как функцию внутри функции.
>>> 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
так как мне заставить gs возвращать "a" изнутри ry? Я думал использовать super, но думаю, что это только для классов.
Спасибо
Произошла небольшая путаница ... Я хочу вернуть только если a == b. если a! = b, то я пока не хочу, чтобы gs что-либо возвращала.
редактировать: Теперь я думаю, что декораторы может быть лучшим решением.






Ты имеешь ввиду?
def gs(a,b):
def ry():
if a==b:
return a
return ry()
вы возвращаете ry () явно, а не просто вызываете его.
There's been a little confusion... I only want to return a if a==b. if a!=b, then I don't want gs to return anything yet.
Тогда проверьте это:
def gs(a,b):
def ry():
if a==b:
return a
ret = ry()
if ret: return ret
# do other stuff
Когда вы упоминаете «шаги» в функции, кажется, что вам нужен генератор:
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.)
@All: вы можете использовать yield только во внутренней функции, если хотите, чтобы внешняя функция оставалась нормальной функцией, и вам не приходилось перебирать результат.
Это должно позволить вам продолжать проверять состояние и возвращаться из внешней функции, если 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 ry ()
if a==b
gs()
в некоторых языках, таких как javascript, вы даже можете передать функцию как переменную в функции:
function gs(a, b, callback) {
if (a==b) callback();
}
gs(a, b, ry);
это не совсем ответ на мой вопрос, НО он решает проблему, которую я пытался решить :)