2016-11-14 9 views
0

У меня возникли трудности с пониманием концепции параметризованного декоратора и того, как он работает. Может кто-то пожалуйста, объясните, как это работает, и что бы декоратор база выглядеть в примере ниже:Использование параметризованного декоратора в python

@base(10) 
def sum(x,y): 
    return x+y 

print(sum(1,2)) 
+1

Возможный дубликат [питона декораторов с параметрами] (http://stackoverflow.com/questions/5929107/python-decorators-with-parameters) – miradulo

+0

Decorator - это функция, которая возвращает функцию. Параметрированный декоратор - это функция, которая возвращает декоратор. – Alex

ответ

0

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

def int2base(x, base): 
    """ Converts int to string with given base representation. 
     Credit to @Alex Martelli on http://stackoverflow.com/questions/2267362/convert-integer-to-a-string-in-a-given-numeric-base-in-python""" 

    if x < 0: sign = -1 
    elif x == 0: return digs[0] 
    else: sign = 1 
    x *= sign 
    digits = [] 
    while x: 
     digits.append(digs[x % base]) 
     x //= base 
    if sign < 0: 
     digits.append('-') 
    digits.reverse() 
    return ''.join(digits) 


def base(num): 
    def decorator(func): 
     def wrapper(*args): 
      return int2base(func(*args), num) 
     return wrapper 
    return decorator 


def my_sum(num1, num2): 
    return num1 + num2 

# using decorator syntax 
@base(2) 
def my_sum2(num1, num2): 
    return num1 + num2 

print(my_sum(1,2)) 
print(my_sum2(1,2)) 

# decorating manually 
decorator = base(2) # base acts kinda like factory method 
my_sum2_manual = decorator(my_sum) 
print(my_sum2_manual(1,2))