我仍在尝试理解Python的基础知识,并试图弄清楚如何在内部函数y
中将值附加到action2
。
def outer(n):
def action(x):
return x ** n
def action2(y):
return x/n
return action2
return action
f = outer(2) #We are actually setting the n in action here
print(f)
print(f(5)) #We are now setting the x parameter in the inner function action
print(f(4))
g = outer(3)
print(g(3))
print(f(3)
由于
答案 0 :(得分:1)
这样嵌套函数的通常原因是函数修饰。几个月前我问a question,其中一个答案似乎几乎完全符合你的用例。基本上你正在尝试这样做:
def outer(n):
def action(x):
def action2(y):
return x**n / y
return action2
return action
这是一种奇怪的方式
def action(n, x, y):
return x**n / y
但我们会用它滚动。在任何情况下,让我们回到我们的规范函数装饰器,看看它是如何比较的。
def decorator(func):
def wrapped(*args, **kwargs):
print("Calling inner function")
return func(*args, **kwargs)
return wrapped
@decorator
def foo(some_txt):
print("Hello, ", some_txt)
# EXAMPLE OUTPUT
>>> foo("World!")
Calling inner function
Hello, World!
这是你想要做的事情的一层太浅。如果我们回到之前链接的问题,我们将讨论验证器。
max_len_12 = lambda n: len(n) <= 12 # 12 character max field length
def validation(v):
"""ensures the result of func passes a validation defined by v"""
def outer(func):
def inner(*args, **kwargs):
while True:
result = func(*args, **kwargs)
# if validation passes
if v(result):
return result
return inner
return outer
@validation(max_len_12)
def valid_input(prompt):
return input(prompt)
# EXAMPLE
>>> valid_input("Enter your name (max 12 chars): ")
Enter your name (max 12 chars): Adam YouBetYourAss Smith
Enter your name (max 12 chars): Adam Smith
'Adam Smith'
或者更容易:
valid_input = validation(max_len_12)(raw_input)
# same as previous function
因为很难确切地知道你试图用你的示例代码做什么,所以希望这能让你在装饰器和闭包时站稳脚跟。请注意,为了使您的功能更加内向,您需要做的事情遍布整个世界,其中大部分都可以由functools.wraps
答案 1 :(得分:0)
我假设您正在努力完成以下任务:
def outer(n):
def action(x):
def action2(y):
return x ** n / y
return action2
return action
现在,您的测试命令给出:
>>> f = outer(2)
>>> print f
<function action at 0x7f59b872e578>
>>> print f(5)
<function action2 at 0x7f59b872e5f0>
>>> print f(4)
<function action2 at 0x7f59b872e5f0>
f
是你的外部“闭包”,它本身就是一个“工厂”函数,返回你的内部闭包。
>>> g = outer(3)
>>> print g(3)
<function action2 at 0x7f59b872e668>
您现在有两个完全独立的功能f
和g
。
>>> print f(3)
<function action2 at 0x7f59b872e668>
...您可以像以前一样继续使用f
,这可能不是您打算做的。
你可以像这样调用内部闭包:
>>> f5 = f(5)
>>> print f5(10.)
2.5
或者您可以完全跳过变量:
>>> outer(3)(10)(2)
500