samedi 2 février 2019

How to extend logging without aggressively modifying code? [Write clean code]

Let's say I have a calculate() method which have complicated calculation with many variables, while I want to log down what is the value of variables in different phase. For example.

# These assignment are arbitrary, 
# but my calculate() method is more complex
def calculate(a, b):
  c = 2*a+b
  d = a-b
  if c > d+10:
    g = another_calc(a, c):
  else:
    g = another_calc(a, d):
  return c, d, g

def another_calc(a, c_d):
  e = a+c_d
  f = a*c_d
  g = e+f
  return g

You may assume the method will be modified a lot for experimental exploration. There is no much logging here and I want to log down what happen, for example I can write aggressive code like this

# These assignment are arbitrary, 
# but my calculate() method is more complex
def calculate(a, b):
  info = {"a": a, "b": b}
  c = 2*a+b
  d = a-b
  info["c"], info["d"] = c, d
  if c > d+10:
    info["switch"] = "entered c"
    g, info = another_calc(a, c, info):
  else:
    info["switch"] = "entered d"
    g, info = another_calc(a, d, info):
  return c, d, g, info

def another_calc(a, c_d, info):
  e = a+c_d
  f = a*c_d
  g = e+f
  info["e"], info["f"], info["g"] = e, f, g
  return g, info

This serve my purpose (I got the info object) But it is pretty ugly to add more (non-functional) lines to the original clean calculate() method, changing signature and return value.

But can I write a cleaner code? I am thinking whether it is possible to use decorator to wrap this method. Hope you guys would have some great answers. Thanks.

Aucun commentaire:

Enregistrer un commentaire