在函数中添加行

时间:2015-06-25 10:42:11

标签: python function

假设我在另一个函数中有两个函数,如下所示:

def FooBar(isTheWorldRound = True):

    def Foo():
        print("Hi, I'm foo.")

    def Bar():
        print("Hi, I'm bar.")

    theFunction = None
    if (isTheWorldRound):
        return Bar
    else:
        return [Bar, Foo]

所以,我可以这样做:

myFunction = FooBar(False)
myFunction()
>>> Hi, I'm Bar
>>> Hi, I'm Foo

关于这个例子,我有两个问题:

  1. 执行注释行的正确方法是什么?
  2. 我是否有办法在不明确定义Foo
  3. 的情况下执行此操作

4 个答案:

答案 0 :(得分:2)

将两个函数放入一个列表就可以了解这一点;功能列表。它创建一个调用前两个函数的新函数。为此,您需要定义一个新的包装函数,例如:

def call_all(*funcs):
    """Create a new wrapper to call each function in turn."""
    def wrapper(*args, **kwargs):
        """Call the functions and return a list of their outputs."""
        return [func(*args, **kwargs) for func in funcs]
    return wrapper

(如果*语法不熟悉,请参阅What does ** (double star) and * (star) do for parameters?,您现在可以使用它们:

theFunction = call_all(Bar, Foo)

另请注意:

theFunction = None
if (isTheWorldRound):
    return Bar
else:
    return [Bar, Foo]

有点尴尬,我会把它写成:

if isTheWorldRound:
    return Bar
return [Bar, Foo]

您还应该按the style guide重命名函数/变量。

答案 1 :(得分:1)

你当然可以用某种方式编写一个新函数FooBar将返回一个评估其中一个或两个函数的函数。

考虑一下:

def F():
    funcs = [Foo, Bar]
    ret = None
    for f in funcs:
        ret = f()
    return ret

您可以在FooBar中创建结束以返回单个作品:

def FooBar(isTheWorldRound = True):
    if (isTheWorldRound):
        funcs = [Bar]
    else:
        funcs = [Bar, Foo]

    def theFunction():
        ret = None
        for f in funcs:
            ret = f()
        return ret
    return theFunction

幸运的是,在Python中,函数是第一类对象,这很容易。

编辑:似乎你想在执行FooBar期间直接执行这些功能。然后你可以抛弃闭包但仍然循环调用所有函数。

答案 2 :(得分:1)

将注释行替换为:

return lambda: [None, Foo(), Bar()][0]

它将按预期工作:

>>> myFunction = FooBar(False)
>>> myFunction()
Hi, I'm foo.
Hi, I'm bar.

它的作用是创建一个匿名函数,在调用时调用Foo()Bar(),然后返回None

答案 3 :(得分:0)

实际上,这应该有效。没有括号,它是一个函数指针(或者Python的等价物)。

要打电话,你可以这样做:

theFunction[0]()

要获取列表中的第0个函数,请应用括号(或任何参数,如果需要)。