Обычная причина вложенности функций, как это для украшения функции. Я спросил 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
Вы не можете, потому что 'action' всегда возвращается в строке до этого. –
В третьей строке функция 'action' возвращает' x ** n', и все после этого на том же уровне отступа и ниже не выполняется. Кроме того, преднамеренно ли вы делите 'x' на' n', фактически не используя параметр 'y'? – user3426575
Я подозреваю, что ваш код не отформатирован должным образом, должен ли я быть прав, не могли бы вы исправить код в своем Q? – gboffi