如何使用装饰器修改* args的类型?

时间:2016-06-07 00:49:12

标签: python python-3.x arguments decorator metaclass

我想使用@decorator允许我以' - '.join(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 个答案:

答案 0 :(得分:2)

你可以近距离接触:

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

但这打印出('1 - 2 - 3',),因为b的主体因args而将*args视为元组,我怀疑装饰者可以解决这个问题。如果身体像print(args[1])那样,你期望会发生什么?

答案 1 :(得分:0)

问题的一部分是你在需要字符串的地方使用整数,所以将它们转换成字符串然后使用join函数。

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