假设我在另一个函数中有两个函数,如下所示:
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
关于这个例子,我有两个问题:
Foo
?答案 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个函数,请应用括号(或任何参数,如果需要)。