сделать возврат родительской функции - супер возврат? - PullRequest
2 голосов
/ 13 января 2009

есть проверка, которую мне нужно выполнить после каждого последующего шага в функции, поэтому я хотел определить этот шаг как функцию внутри функции.

>>> 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

так, как мне заставить g вернуть 'a' изнутри ry? Я думал об использовании супер, но думаю, что это только для классов.

Спасибо

Там была небольшая путаница ... Я хочу вернуть только если a == b. если a! = b, то я не хочу, чтобы gs еще что-либо возвращал.

edit : теперь я думаю, что decorators может быть лучшим решением.

Ответы [ 6 ]

10 голосов
/ 13 января 2009

Вы имеете в виду?

def gs(a,b):
    def ry():
        if a==b:
            return a
    return ry()
4 голосов
/ 14 января 2009

Когда вы упоминаете "шаги" в функции, кажется, что вам нужен генератор:

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 .)

3 голосов
/ 14 января 2009

Там была небольшая путаница ... Я хотите вернуть только если 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
2 голосов
/ 18 февраля 2009

Это должно позволить вам продолжать проверять состояние и возвращаться из внешней функции, если 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]
1 голос
/ 28 сентября 2010

У меня была похожая проблема, но я решил ее, просто изменив порядок звонка.

def ry ()
    if a==b 
        gs()

в некоторых языках, таких как javascript, вы даже можете передать функцию как переменную в функции:

function gs(a, b, callback) {
   if (a==b) callback();
}

gs(a, b, ry);
1 голос
/ 13 января 2009

вы возвращаете ry () явно, а не просто вызываете его.

...