2016-06-07 3 views
3

Я хотел бы использовать @decorator, чтобы позволить мне иметь доступ к ' - '.join(args) как args, как показано ниже. Возможно ли это, используя метакласс?Как я могу использовать декоратор для изменения типа * args?

def a(*args): 
    print(args) 
a(1, 2, 3) 
# (1, 2, 3) 

@magic 
def b(*args): 
    print(args) 
b(1, 2, 3) 
# 1 - 2 - 3 

ответ

2

Вы можете подобраться:

def magic(func): 
    def wrapper(*args): 
     return func(' - '.join(map(str, args))) 
    return wrapper 

но это печатает ('1 - 2 - 3',), так как тело b видит args как кортеж из-за *args, и я сомневаюсь, что декоратор может обойти это. Что вы ожидаете, если тело похоже на print(args[1])?

+0

Это то, что я хочу, но важная часть для меня - это обход «args», являющийся кортежем. Можно ли использовать метакласс для изменения этой функции? – 2Cubed

+0

Тело обычно не должно индексировать 'args' - он будет ожидать, что это будет строка. (Однако, если это так, 'args [1]' вернет второй символ в строке.) – 2Cubed

+0

Это не ваш первый вопрос, когда вы просили какой-то довольно странный материал. Вероятно, это приведет к ошибочному и запутанному коду. почему ты хочешь сделать это? –

0

Итак, часть проблемы состоит в том, что вы используете целые числа, где вам нужны строки, поэтому конвертируйте их в строки и затем используйте функцию соединения.

def magic(func): 
    def wrapper(*args): 
     return ' - '.join(map(str, args)) 
    return wrapper 

@magic 
def a(*args): 
    return 'Arguments were {}.'.format(args) 

print(a(1, 2, 3)) 
+0

Хотя это действительно работает, это не то, о чем я прошу. Я хочу эту функциональность в декораторе, а затем возможность доступа к 'args' как строку' '1 - 2 - 3" '(а не кортеж) в самой функции. – 2Cubed

+0

Я обновил его в соответствии с вашими требованиями. – whybull

+0

Это действительно работает, но он никогда не выполняет 'a'. На выходе отображаются «1 - 2 - 3», но он никогда не показывает «Аргументы были 1 - 2 - 3». В объявлении декоратора 'magic' функция' func() 'никогда не вызывается. – 2Cubed