заставить родительскую функцию возвращать - super return?
Вопрос
существует проверка, которую мне нужно выполнять после каждого последующего шага в функции, поэтому я хотел определить этот шаг как функцию внутри функции.
>>> 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 только в том случае, если a==b.если 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, только если a==b.если 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);