2015-02-01 2 views
0

Я хотел бы использовать декоратор для преобразования аргументов функции.Декоратор для преобразования аргументов функции

так вместо того, чтобы делать:

def get_data(dt, symbol, depth, session): 
    dt = to_date(dt) 
    ... 

или

def get_data(dt, symbol, depth, session): 
    dt = convert(dt, to_date) 
    ... 

Я хотел бы, чтобы иметь возможность написать что-то вроде

@convert('dt', to_date) 
def get_data(dt, symbol, depth, session): 
    ... 

, но я не чувствую себя очень комфортабельный с эта особенность.

Как написать такой декоратор?

+0

Есть ли здесь настоящий вопрос? С какими проблемами вы столкнулись, когда вы внедрили декоратор? –

+0

Я не понимаю, как написать этот декоратор (потому что у меня нет опыта с ними) –

+0

Почему вы думаете, что это будет лучший способ, чем то, как вы это делаете? что именно вы ожидаете от этого декоратора ... –

ответ

3

возился с ним немного и узнал совсем немного о генераторах:

def convert(arg, mod): 
    def actual_convert(fn): 
     if arg not in fn.__code__.co_varnames: 
      return fn 
     else: 
      def new_function(*args, **kwargs): 
       l_args = list(args) 
       index = fn.__code__.co_varnames.index(arg) 
       l_args[index] = mod(l_args[fn.__code__.co_varnames.index(arg)]) 
       args = tuple(l_args) 
       return fn(*args, **kwargs) 
      return new_function 
    return actual_convert 

@convert('x',lambda x: x+1) 
def add(x,y): 
    return x + y 

print("Should be 5:",add(3,1)) 

Это будет работать только с нормальными аргументами в настоящее время, не именованные аргументы. Однако было бы довольно легко сделать это.

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