Форум сайта python.su
Скажите я правильно понимаю что в ситуации когда одна функция вложена в другую, то при вызове внешней функции, внутрення будет работать только если в коде будет вызов внутренней функции.
Вопрос возник после прочтения статьи о декораторах на хабре.
https://habrahabr.ru/post/141411/
При описании создания декоратора “вручную”, я не увидел в коде вызова внутреннй функции
def the_wrapper_around_the_original_function():,
только через return.
Как тогда это все работает в этом случае.
Офлайн
roggergДекоратор - это функция, которая принимает функцию и возвращает другую функцию.
При описании создания декоратора “вручную”, я не увидел в коде вызова внутреннй функции
Офлайн
roggergВложенная функция работает так же, как невложенная. Если она определена, то её надо вызвать, чтобы она сработала. А вызывается она там, где видна, а видна она только внутри функции, в которой определена.
Скажите я правильно понимаю что в ситуации когда одна функция вложена в другую, то при вызове внешней функции, внутрення будет работать только если в коде будет вызов внутренней функции.
>>> def f(): ... def g(x): ... print('g') ... return x * 2 ... print('f') ... print(g(8)) ... print('end') ... >>> f() f g 16 end >>>
>>> def dec(func): ... return 1 ... >>> @dec ... def f(x): ... return x * 2 ... >>> f 1 >>>
>>> def dec(func): ... return lambda: 'nothing' ... >>> @dec ... def f(x): ... return x * 2 ... >>> f <function dec.<locals>.<lambda> at 0xb73dc5cc> >>> f() 'nothing' >>>
>>> def g(): ... return 'g' ... >>> def dec(func): ... return g ... >>> @dec ... def f(x): ... return x * 2 ... >>> f <function g at 0xb75183d4> >>> f() 'g' >>>
>>> def g(x): ... print('g') ... return x ... >>> def dec(func): ... return lambda x: g(func(x)) ... >>> @dec ... def f(x): ... return x * 2 ... >>> f <function dec.<locals>.<lambda> at 0xb74375cc> >>> f(8) g 16 >>>
Отредактировано py.user.next (Дек. 2, 2016 07:05:43)
Офлайн
Спасибо за объяснения. у мен я есть еще один вопрос
если fn это функция, то есть ли отличие между return fn и return fn()
Офлайн
roggergfn - это имя, привязанное к объекту-функции.
если fn это функция, то есть ли отличие между return fn и return fn()
>>> f = print >>> f('abc') abc >>> f('abc', 'def') abc def >>> f is print True >>> id(f) 3075392716 >>> id(print) 3075392716 >>>
>>> a = b = c = print >>> a(1) 1 >>> b(1, 2, 3) 1 2 3 >>> c([1], [2]) [1] [2] >>> print('test') test >>>
Отредактировано py.user.next (Дек. 4, 2016 02:15:13)
Офлайн
roggerg
то есть ли отличие между return fn и return fn()
def f(): pass def g(): return f print(g()())
def f(): pass def g(): return f() print(g())
Офлайн