如何使用Python在基本装饰器中传递带参数的函数?

时间:2016-09-11 21:58:30

标签: python python-decorators

我正在阅读有关装饰器的知识,并且从Simeons blog学到了很多东西,之前我没有在函数中传递过这样的参数:decorator(func)。我认为我的问题是装饰器(func(args))。我认为我的问题是func(args)正在执行并将其返回值传递给装饰器而不是函数本身。我怎样才能传递一个功能&装饰器中的参数(示例B)并且不使用@decorator_name'装饰'样式(示例A)。

编辑:我希望示例B生成与示例A相同的结果。

user_input = input("Type what you want:  ")

def camel_case(func):
   def _decorator(arg):
      s = ""
      words = arg.split()
      word_count = len(words)
      for i in range(word_count):
         if i >0:
            s += words[i].title()
         else:
            s += words[i].lower()
      return func(s)
   return _decorator

示例A:这有效

@camel_case
def read(text):
   print("\n" + text" )

read(user_input)

示例B:这不起作用

def read(text):
   print("\n" + text" )

camel_case(read(user_input))

2 个答案:

答案 0 :(得分:2)

装饰者接受一个功能:camel_case(read)。如果您尝试将camel_case应用于read(user_input)功能,请尝试以下操作:

camel_case(read)(user_input)

camel_case(read)返回已修饰的函数,然后使用(user_input)调用该函数。

答案 1 :(得分:0)

将函数作为参数提供给装饰器;装饰器返回一个新函数;然后使用user_input作为参数调用此返回的函数:

camel_case(read)(user_input)