Decorator

Write loging decorator.


In [24]:
import functools

def logger(func):
    @functools.wraps(func)
    def wrapped(num_list):
        result = func(num_list)
        with open('decorator.log', 'w') as f:
            f.write("{}\n".format(str(result)))
        
        return result
    # end of wrapped()
    
    return wrapped
    
@logger
def summator(num_list):
    return sum(num_list)

print("summator(): {}".format(summator([1,2,3,4,5])))


summator(): 15

In [25]:
with open("decorator.log", "r") as f:
    print("decorator.log: {}".format(f.read()))


decorator.log: 15


In [26]:
print(summator.__name__)


summator

Decorator 2

Write decorator with parameters.


In [34]:
def logger(filename):
    def decorator(func):
        def wrapped(*ars, **kwards):
            result = func(*ars, **kwards)
            with open(filename, 'w') as f:
                f.write(str(result))
            return result
        
        return wrapped
    return decorator

@logger('decorator_new.log')
def summator(num_list):
    return sum(num_list)

print("summator: {}".format( summator(list(range(1,7))) ))

with open('decorator_new.log', 'r') as f:
    print("from log: {}".format(f.read()))


summator: 21
from log: 21

Decorator 3

Chain of decorators.


In [39]:
import functools

def bold(func):
    @functools.wraps(func)
    def wrapped(*args, **kwargs):
        return "<b>{}</b>".format(func(*args, **kwargs))
        
    return wrapped

def italic(func):
    @functools.wraps(func)
    def wrapped(*args, **kwargs):
        return "<i>{}</i>".format(func(*args, **kwargs))
        
    return wrapped


  File "<ipython-input-39-56cb788f4a89>", line 12
    def wrapped(*args, **kwargs):
      ^
SyntaxError: invalid syntax

In [38]:
@bold
@italic
def hello():
    return "hello!"

print(hello())

print(hello.__name__)


<b><i>hello!</i></b>
wrapped

In [ ]: