Python dekoratory

Michał Mojek · May 8, 2019

  • Jest to funkcja, które bierzę innę funkcję
  • Rozszerza jej funkcjonalność
  • Robi to bez wyraźnej modyfikacji funkcji.

1 Funkcje

1.1 Przykłady funkcji

Prosty przykład definiowania funkcji.

def my_func(arg):
    """docstring"""
    my_var = arg + 5
    return my_var

my_func(3)

Funkcję w pythone to typ pierwszoklasowy (wiki) first class object

1.2 First class object

  • może być przechowywany w zmiennej i strukturach danych,
  • może być przekazywany jako parametr do procedury/funkcji,
  • może być zwracany przez procedury/funkcje,
  • może być tworzony na bieżąco,
  • posiada tożsamość (niezależną od nazwy),

1.3 Inner functions

def parent():
    """docstring"""
    my_var = arg + 5
    def first_child():
        print("print first childe")
    def second_child():
        print("print first childe")    
    

parent()

1.4 Zwracanie funkcji z funkcji

def parent(num):
    def first_child():
        return "Hi, I am Emma"

    def second_child():
        return "Call me Liam"

    if num == 1:
        return first_child
    else:
        return second_child

>>> first = parent(1)
>>> second = parent(2)

>>> first
<function parent.<locals>.first_child at 0x7f599f1e2e18>

>>> second
<function parent.<locals>.second_child at 0x7f599dad5268>


>>> first()
'Hi, I am Emma'

>>> second()
'Call me Liam'

2 Dekoratory

 def my_decorator(func):
    def wrapper():
        print("Something is happening before the function is called.")
        func()
        print("Something is happening after the function is called.")
    return wrapper

def say_whee():
    print("Whee!")

say_whee = my_decorator(say_whee)
>>> say_whee()
Something is happening before the function is called.
Whee!
Something is happening after the function is called.

3 Wzrór

import functools

def decorator(func):
    @functools.wraps(func)
    def wrapper_decorator(*args, **kwargs):
        # Do something before
        value = func(*args, **kwargs)
        # Do something after
        return value
    return wrapper_decorator

Twitter, Facebook