向函数添加行

2024-10-05 10:51:20 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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的情况下实现这一点?你知道吗

Tags: 方法函数truereturnfoodefbarhi
3条回答

您当然可以按照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中很容易,因为函数是一级对象。你知道吗

Edit:似乎您希望在执行FooBar期间直接执行函数。然后可以放弃闭包,但仍然调用循环中的所有函数。你知道吗

把两个函数放到一个列表中,就得到了一个函数列表。它不会生成一个调用前面两个函数的新函数。为此,您需要定义一个新的包装函数,例如:

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重命名函数/变量。你知道吗

将注释行替换为:

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

它将按预期工作:

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

它所做的是创建一个匿名函数,在调用时同时调用Foo()Bar(),并返回None。你知道吗

相关问题 更多 >

    热门问题