2016-09-11 5 views
0

Я читаю о декораторах и узнал совсем немного от Simeons blog У меня был успех до того, когда в функции не было аргументов: decorator (func). Я думаю, что моя проблема - декоратор (func (args)). Я думаю, что моя проблема func (args) выполняет и передает возвращаемое значение декоратору вместо самой функции. Как передать аргумент & в декораторе (пример B) и не использовать стиль украшения @decorator_name (пример A).Как передать функцию с аргументом в базовом декораторе с использованием Python?

Изменить: Я хотел бы пример B для получения того же результата, как, например, А.

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)) 
+0

Что вы пытаетесь достичь? –

+0

Что вы должны сделать: 'camel_case (read) (user_input)' –

+0

Только что отредактировал вопрос. Я хотел бы, чтобы оба примера B дали тот же результат, что и пример А. –

ответ

0

Дайте функции декоратору в качестве аргумента; декоратор возвращает новую функцию; затем вызвать эту функцию, возвращенную с user_input в качестве аргумента:

camel_case(read)(user_input) 
2

декоратора принимает функцию: camel_case(read). Если вы пытаетесь применить camel_case к функции read(user_input), попробуйте следующее:

camel_case(read)(user_input) 

camel_case(read) возвращает украшенную функцию, которую вы затем вызвать с (user_input).