在* args中打印项目

时间:2019-04-21 11:52:18

标签: python

我正在实现装饰器,并试图获取输出

  • “嗨,约翰”
  • “汤姆你好”
  • “嗨,约翰”
  • “汤姆你好”

请有人能解释为什么.format(i for i in args)不遍历JohnTom而是打印变量args

的位置
def doDouble (func):
    def wrapper_doDouble (*args):
        func(*args)
        func(*args)
    return wrapper_doDouble

@doDouble
def functionToPrint(*args):
    print ("Hi {}".format(i for i in args))

functionToPrint("John", "Tom")

这是我当前的输出:

Hi <generator object functionToPrint.<locals>.<genexpr> at 0x03CEFD80>
Hi <generator object functionToPrint.<locals>.<genexpr> at 0x03CDA1B0>

2 个答案:

答案 0 :(得分:5)

问题不在装饰器中。它在format中。

 "hi {}".format("john", "tom")

将仅显示“ john”,因为您仅在格式化字符串中使用第一个参数。将其替换为例如

print ("\n".join(len(args) *["Hi {}"])).format(*args))

答案 1 :(得分:3)

您的inline for循环位置略有错误。您想重复调用Hi格式,而不是将列表传递到Hi中。由于这将生成多个值,因此您需要将它们join重新放在一起。

def doDouble (func):
    def wrapper_doDouble (*args):
        func(*args)
        func(*args)
    return wrapper_doDouble

@doDouble
def functionToPrint(*args):
    print ("\n".join("Hi {}".format(i) for i in args))

functionToPrint("John", "Tom")