оболочка python в оболочке - порядок выполнения сбивает с толку? - PullRequest
0 голосов
/ 22 января 2019

я впервые публикую здесь вопрос, поэтому я хотел бы извиниться, если нарушаю какие-либо правила. спасибо

У меня вопрос, почему печать на python3 3 1 2 4 вместо 3 4 1 2 4 по следующему коду? Мой аргумент ... если python отправляется на печать 2 [что подразумевает чтение print_two из print_one], почему python сначала не пошел на печать 4, прежде чем перейти к печати 1?

Большое спасибо.

def print_one(x):
    print(1)
    def print_two():
        print(2)
        return x()
    return print_two

def print_three(x):
    print(3)
    def print_four():
        print(4)

    return print_four

def major_print():
    print("major print")

major_print = print_one(print_three(major_print))

if __name__ == "__main__":
    major_print()

1 Ответ

0 голосов
/ 22 января 2019

Это легко объяснить:

Первый оператор печати в обеих функциях декорирования выполняется, как только вы декорируете функцию. Если вы пропустите вызов функции, вы получите вывод

3
1

Это потому, что внутренний декоратор print_three вызывается первым, а print_one декорирует функцию позже.

Операторы печати внутри функций-оболочек (которые изменяют вашу исходную функцию) выполняются при вызове функции. Поскольку print_four не использует аргумент декоратора, вы просто декорируете его с помощью print_two. Так что эквивалентом конечной функции будет что-то вроде

def major_print():
    print(2)
    print(4)
    return None

Таким образом, вы получаете указанную последовательность чисел 3124 в качестве вывода на консоль.

...