In [1]:
def decorator(f):
return f
In [2]:
@decorator
def holidays():
print("PyATL Decemeber 2014")
In [3]:
my_dir = dir
my_funcs = [enumerate, int]
In [4]:
map(float, range(3))
def helper():
return help
In [5]:
def outer(x=4):
def inner(y=0):
return x+y
return inner
In [6]:
o = outer()
o()
Out[6]:
In [7]:
def make_awesome(f):
f.__awesome__ = True
return f
In [8]:
@make_awesome
def random():
return 4
In [9]:
def loggit(f):
def logger(*args, **kwargs):
print("Calling {}.".format(f.__name__))
return f(*args, **kwargs)
return logger
In [10]:
@loggit
def random():
"""Chosen by a fair dice roll."""
return 4
In [11]:
from functools import wraps
def loggit(f):
@wraps(f)
def logger(*args, **kwargs):
print("Calling {}.".format(f.__name__))
return f(*args, **kwargs)
return logger
In [12]:
@loggit
def random():
"""Chosen by a fair dice roll."""
return 4
assert random.__name__ == 'random'
In [13]:
from functools import update_wrapper
class wrapperobj:
def __init__(self, f):
update_wrapper(self, f)
self.__f = f
def __call__(self, *args, **kwargs):
return self.__f(*args,**kwargs)
In [14]:
@wrapperobj
def random():
return 4
In [15]:
class singlewrapper:
def __call__(self, f):
@wraps(f)
def wrapper(*args, **kwargs):
return f(*args, **kwargs)
return wrapper
In [16]:
wrapper = singlewrapper()
@wrapper
def random():
return 4
In [17]:
from functools import total_ordering
@total_ordering
class Person:
def __init__(self, age, name):
self.age = age
self.name = name.lower()
def __eq__(self, other):
return ((self.age, self.name)) == \
((other.age, other.name))
def __lt__(self, other):
return ((self.age, self.name)) < \
((other.age, other.name))
Person(26, "Alec") > Person(22, "Colin")
Out[17]:
In [18]:
class Foo:
@loggit
def bar(self, n=1):
return ' '.join(['Frob'] * n)
Foo().bar()
Out[18]:
In [19]:
class Foo:
@wrapperobj
def bar(self, n=1):
return ' '.join(['Frob'] * n)
Foo().bar
Out[19]:
In [20]:
from functools import partial
class methodwrapper:
def __init__(self, method):
update_wrapper(self, method)
self.__method = method
def __get__(self, instance, type_):
if instance is None:
return self.__method
return partial(self.__method, instance)
In [21]:
class Foo:
@methodwrapper
def bar(self, n):
return ' '.join(['Frob'] * n)
Foo().bar(2)
Out[21]:
In [22]:
@wrapperobj
@loggit
@make_awesome
def random():
return 4
assert hasattr(random, '__awesome__')
In [23]:
import inspect
orig = inspect.unwrap(random)
assert isinstance(random, wrapperobj)
assert not isinstance(orig, wrapperobj)
In [24]:
print("Wrapped ArgSpec:", inspect.getargspec(random))
In [25]:
print("Unwrapped ArgSpec:", inspect.getargspec(
inspect.unwrap(random)))
In [26]:
print(inspect.getsource(Foo.bar))
In [27]:
from types import FunctionType
assert isinstance(Foo.bar, FunctionType)