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

How can I use a decorator to modify the type of *args?

我想使用 @decorator 让我能够像 args 一样访问 ' - '.join(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

你可以接近:

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

但这会打印出 ('1 - 2 - 3',),因为 b 的正文由于 *args 而将 args 视为一个元组,我怀疑装饰器能否解决这个问题.如果 body 是 print(args[1]) 的样子,你期望会发生什么?

所以部分问题是您在需要字符串的地方使用了整数,因此请将它们转换为字符串,然后使用连接函数。

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