2015-06-16 2 views
0

Я пытался узнать больше о декораторах Python, используя отличный учебник по адресу https://realpython.com/blog/python/primer-on-python-decorators/.с выпуском декоратора python

Я попытался отклониться от сценария и столкнулся с некоторыми проблемами. Код ниже. В основном, когда я запускаю сценарий ниже, первый вызов функции time_print_function() выполняется, как ожидалось.

Но я получаю сообщение об ошибке в my_decorator вызова следующей функции (печать (datetime.datetime.now()))()

Я ожидал, что это будет производить вывод такой же, как time_print_function()

кодекс

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()))() 

ответ

3

проблема заключается в том, что это выражение:

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

Уже вызывает функцию печати перед передачей ее в качестве параметра в вызов my_decorator. my_decorator получает возвращаемое значение из print, которое является None и пытается вызвать его, приводя к ошибке (Нет, очевидно, не подлежит вызову).

Аргумент декоратор должен быть функцией - вы можете создать один инлайн с помощью лямбда, например, в:

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

Спасибо. Все еще видя ошибку. Мне нужно что-то импортировать, прежде чем я смогу использовать лямбда. Я пробовал импорт os. Файл "decorator_examples.py", строка 53 my_decorator (лямбда: печать (datetime.datetime.now()))() ^ SyntaxError: неверный синтаксис [Законченный в 0.1се с кодом выхода 1] –

+0

Не для лямбды , но для использования «print» в качестве функции вам нужно либо использовать Python3.x, либо делать из __future__ import print_function' в Python 2.x – jsbueno

+0

Спасибо. это работает. –

Смежные вопросы