¿Cómo puedo pasar una variable en un decorador al argumento de una función en una función decorada?

Estoy en progreso para aprender Python. Esperemos que alguien me apunte a manera correcta.
Esto es lo que me gustaría hacer a continuación:

def decorate(function): def wrap_function(*args, **kwargs): str = 'Hello!' # This is what I want return function(*args, **kwargs) return wrap_function @decorate def print_message(): # I'd like to pass 'str' as mentioned above # to any functions' argument like below: print(str) # 'str' is same as above 

¿Alguna idea? Gracias por adelantado.

No puede pasarlo como su propio nombre, pero puede agregarlo a las palabras clave.

 def decorate(function): def wrap_function(*args, **kwargs): kwargs['str'] = 'Hello!' return function(*args, **kwargs) return wrap_function @decorate def print_message(*args, **kwargs): print(kwargs['str']) 

Alternativamente puedes nombrar su propio argumento:

 def decorate(function): def wrap_function(*args, **kwargs): str = 'Hello!' return function(str, *args, **kwargs) return wrap_function @decorate def print_message(str, *args, **kwargs): print(str) 

Método de clase:

 def decorate(function): def wrap_function(*args, **kwargs): str = 'Hello!' args.insert(1, str) return function(*args, **kwargs) return wrap_function class Printer: @decorate def print_message(self, str, *args, **kwargs): print(str) 

Si desea que el argumento sea “inyectado opcionalmente”, solo en caso de que la función lo tome, use algo como esto:

 import inspect def decorate(func): def wrap_and_call(*args, **kwargs): if 'str' in inspect.getargspec(func).args: kwargs['str'] = 'Hello!' return func(*args, **kwargs) return wrap_and_call @decorate def func1(str): print "Works! - " + str @decorate def func2(): print "Should work, also."