python - Using a decorated function as a function's default argument -


consider module:

#mymodule.py import logging  def print_start_end(name):     """     decorator creates logger , logs start      , end of function call     """     def decorator(f):         logger = logging.getlogger(name)         def wrapper(*args, **kwargs):             logger.info("start")             res = f(*args, **kwargs)             logger.info("end")             return res         return wrapper     return decorator  @print_start_end(__name__) def f(x):     return x  def g(y=f(3)):     return y 

and example script:

import logging mymodule import f  logger = logging.getlogger("") logger.setlevel(logging.info) h = logging.streamhandler() h.setlevel(logging.info) logger.addhandler(h)  print f(3) 

output:

start end 3 

the decorator working. write script use g instead of f:

import logging mymodule import g  logger = logging.getlogger("") logger.setlevel(logging.info) h = logging.streamhandler() h.setlevel(logging.info) logger.addhandler(h)  print g() 

output:

3 

when executing statement print g(), call f successful because printed expected return value 3. why doesn't print "start" , "end"?

note f(3) in def g(y=f(3)): executed once, when function defined, not every time when called.

thus, problem seems time f(3) executed in mymodule, logger not yet initialized. initialize first, import, works:

import logging  logger = logging.getlogger("") logger.setlevel(logging.info) h = logging.streamhandler() h.setlevel(logging.info) logger.addhandler(h)  mymodule import g  print g() 

Comments

Popular posts from this blog

How has firefox/gecko HTML+CSS rendering changed in version 38? -

android - CollapsingToolbarLayout: position the ExpandedText programmatically -

Listeners to visualise results of load test in JMeter -