简体   繁体   中英

having issue with python decorator

I was trying to learn more about Python decorators using excellent tutorial at https://realpython.com/blog/python/primer-on-python-decorators/ .

I tried to deviate from the script and am running into some issues. The code is below. Basically, when I run the script below, the first function call to time_print_function() executes as expected.

But I get an error in the next function call my_decorator(print(datetime.datetime.now()))()

I expected that this will produce output same as time_print_function()

Code is

def my_decorator(some_function):
  def wrapper(*args):
      print "Something is happening before some_function() is called."


  if args:
    some_function(args)
  else:
    some_function()
  print "Something is happening after some_function() is called."


return wrapper

@my_decorator
def time_print_function():
  print(datetime.datetime.now())
time_print_function()
my_decorator(print(datetime.datetime.now()))()

The problem is that this expression:

my_decorator(print(datetime.datetime.now()))()

Already calls the print function before passing it as a parameter to the my_decorator call. The my_decorator receives the return value of print which is None and tries to call it, yielding an error (None is obviously not callable).

The argument to a decorator should be a function - you can create one inline using lambda, for example in:

my_decorator(lambda: print(datetime.datetime.now()) )()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM