Skip to content

Instantly share code, notes, and snippets.

@farhangamary
Created November 26, 2024 03:33
Show Gist options
  • Select an option

  • Save farhangamary/b2e32e00af613bc01e406453e5d60682 to your computer and use it in GitHub Desktop.

Select an option

Save farhangamary/b2e32e00af613bc01e406453e5d60682 to your computer and use it in GitHub Desktop.
The simplicity of AOP in python!
class Aspect:
def before(self, func, *args, **kwargs):
pass
def after(self, result, func, *args, **kwargs):
return result
def except_raised(self, func, excpt, *args, **kwargs):
pass
def logger(aspect):
def wrapper(func):
def do_and_log(*args, **kwargs):
aspect.before(func, *args, **kwargs)
try:
result = func(*args, **kwargs)
aspect.after(func, result, *args, **kwargs)
return result
except Exception as excpt:
aspect.except_raised(func, excpt, *args, **kwargs)
return None
return do_and_log
return wrapper
class Logging(Aspect):
def before(self, func, *args, **kwargs):
print(f"[Starting] {func.__name__}(args={args}, kwargs={kwargs})")
def after(self, func, result, *args, **kwargs):
print(f"[Finished] {func.__name__}(args={args}, kwargs={kwargs})")
return result
def except_raised(self, func, ex, *args, **kwargs):
print(f"[Exception] in {func.__name__}(args={args}, kwargs={kwargs}): {ex}")
loggingAspect = Logging()
@logger(loggingAspect)
def devide(a, b):
return a / b
devide(19, 0)
devide(109, 17)
############# Output ####################
# [Starting] devide(args=(19, 0), kwargs={})
# [Exception] in devide(args=(19, 0), kwargs={}): division by zero
# [Starting] devide(args=(109, 17), kwargs={})
# [Finished] devide(args=(109, 17), kwargs={})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment