import functools
_DEPENDENCIES = {}
def register_dependency(dependency, object):
_DEPENDENCIES[dependency] = object
def lookup_dependency(dependency):
return _DEPENDENCIES[dependency]
def depends(*dependencies):
def decorator(f):
@functools.wraps(f)
def wrapper(*args, **kwargs):
for dependency in dependencies:
if dependency not in kwargs:
kwargs[dependency] = lookup_dependency(dependency)
return f(*args, **kwargs)
return wrapper
return decorator
################################################################################
register_dependency('printer', print)
class Greeter:
@depends('printer')
def __init__(self, printer):
self.printer = printer
def greet(self, person):
self.printer('Hello, {0}!'.format(person))
register_dependency('greeter', Greeter())
@depends('greeter')
def salute(person, greeter):
greeter.greet(person)
salute('rightfold')
aW1wb3J0IGZ1bmN0b29scwoKX0RFUEVOREVOQ0lFUyA9IHt9CgpkZWYgcmVnaXN0ZXJfZGVwZW5kZW5jeShkZXBlbmRlbmN5LCBvYmplY3QpOgogICAgX0RFUEVOREVOQ0lFU1tkZXBlbmRlbmN5XSA9IG9iamVjdAoKZGVmIGxvb2t1cF9kZXBlbmRlbmN5KGRlcGVuZGVuY3kpOgogICAgcmV0dXJuIF9ERVBFTkRFTkNJRVNbZGVwZW5kZW5jeV0KCmRlZiBkZXBlbmRzKCpkZXBlbmRlbmNpZXMpOgogICAgZGVmIGRlY29yYXRvcihmKToKICAgICAgICBAZnVuY3Rvb2xzLndyYXBzKGYpCiAgICAgICAgZGVmIHdyYXBwZXIoKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAgICAgZm9yIGRlcGVuZGVuY3kgaW4gZGVwZW5kZW5jaWVzOgogICAgICAgICAgICAgICAgaWYgZGVwZW5kZW5jeSBub3QgaW4ga3dhcmdzOgogICAgICAgICAgICAgICAgICAgIGt3YXJnc1tkZXBlbmRlbmN5XSA9IGxvb2t1cF9kZXBlbmRlbmN5KGRlcGVuZGVuY3kpCiAgICAgICAgICAgIHJldHVybiBmKCphcmdzLCAqKmt3YXJncykKICAgICAgICByZXR1cm4gd3JhcHBlcgogICAgcmV0dXJuIGRlY29yYXRvcgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCnJlZ2lzdGVyX2RlcGVuZGVuY3koJ3ByaW50ZXInLCBwcmludCkKCmNsYXNzIEdyZWV0ZXI6CiAgICBAZGVwZW5kcygncHJpbnRlcicpCiAgICBkZWYgX19pbml0X18oc2VsZiwgcHJpbnRlcik6CiAgICAgICAgc2VsZi5wcmludGVyID0gcHJpbnRlcgoKICAgIGRlZiBncmVldChzZWxmLCBwZXJzb24pOgogICAgICAgIHNlbGYucHJpbnRlcignSGVsbG8sIHswfSEnLmZvcm1hdChwZXJzb24pKQoKcmVnaXN0ZXJfZGVwZW5kZW5jeSgnZ3JlZXRlcicsIEdyZWV0ZXIoKSkKCkBkZXBlbmRzKCdncmVldGVyJykKZGVmIHNhbHV0ZShwZXJzb24sIGdyZWV0ZXIpOgogICAgZ3JlZXRlci5ncmVldChwZXJzb24pCgpzYWx1dGUoJ3JpZ2h0Zm9sZCcpCg==