代码之家  ›  专栏  ›  技术社区  ›  Jiaaro

使父函数返回-超级返回?

  •  2
  • Jiaaro  · 技术社区  · 15 年前

    在函数中的每个后续步骤之后,都需要执行一个检查,因此我想将该步骤定义为函数中的一个函数。

    >>> 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从Ry内部返回“A”?我想用super,但那只是上课用的。

    谢谢

    有点困惑…如果a==b,我只想返回a。如果a!B,那我还不想让GS退还任何东西。

    编辑 我现在想 decorators 可能是最好的解决方案。

    6 回复  |  直到 12 年前
        1
  •  2
  •   Mike Boers    15 年前

    这应该允许您不断检查状态,并在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]
    
        2
  •  10
  •   S.Lott    15 年前

    你的意思是?

    def gs(a,b):
        def ry():
            if a==b:
                return a
        return ry()
    
        3
  •  4
  •   Alec Thomas    15 年前

    正如您在函数中提到的“步骤”一样,您似乎想要一个生成器:

    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使用 new yield syntax )

        4
  •  3
  •   Lawrence    15 年前

    有点困惑…我 仅在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
    
        5
  •  1
  •   user54650    15 年前

    显式返回ry(),而不是直接调用它。

        6
  •  1
  •   LPL user462990    12 年前

    我有一个类似的问题,但通过简单地改变通话顺序来解决。

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

    在某些语言(如javascript)中,您甚至可以将函数作为变量传递给函数:

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