索引错误:在解析方法参数时元组索引超出范围

7

我已经查看了这个问题,但是在那里找不到答案。这里有一个简单的示例,演示了我的用例:

def log(*args):
    message = str(args[0])
    arguments = tuple(args[1:])
    # message itself
    print(message)
    # arguments for str.format()0
    print(arguments)
    # shows that arguments have correct indexes
    for index, value in enumerate(arguments):
        print("{}: {}".format(index, value))
    # and amount of placeholders == amount of arguments
    print("Amount of placeholders: {}, Amount of variables: {}".format(message.count('{}'), len(arguments)))

    # But this still fails! Why?
    print(message.format(arguments))

log("First: {}, Second: {}, Third: {}, Fourth: {}", "asdasd", "ddsdd", "12312333", "fdfdf")

输出结果如下:

First: {}, Second: {}, Third: {}, Fourth: {}
('asdasd', 'ddsdd', '12312333', 'fdfdf')
0: asdasd
1: ddsdd
2: 12312333
3: fdfdf
Amount of placeholders: 4, Amount of variables: 4
Traceback (most recent call last):
  File "C:/Users/sbt-anikeev-ae/IdeaProjects/test-this-thing-on-python/test-this-thing.py", line 12, in <module>
    log("First: {}, Second: {}, Third: {}, Fourth: {}", "asdasd", "ddsdd", "12312333", "fdfdf")
  File "C:/Users/sbt-anikeev-ae/IdeaProjects/test-this-thing-on-python/test-this-thing.py", line 10, in log
    print(message.format(arguments))
IndexError: tuple index out of range

P.S:我已经拒绝使用这种方法(包装 str.format() ),因为它看起来是多余的。但我仍然感到困惑,为什么这不像预期的那样工作?

3个回答

11

你需要使用*来将元组解包为实际的参数,以便用于format函数:

你需要使用*来将元组解包为实际的参数,以便用于format函数:

print(message.format(*arguments))

否则,arguments会被视为格式化的唯一参数(并且它适用于第一个 {} 的出现,通过将元组转换为字符串,但在遇到第二个 {} 的时候会失败)


1
你需要传递参数而不是元组。这可以通过使用“*arguments”来完成。 将元组展开为参数
def log(*args):
    message = str(args[0])
    arguments = tuple(args[1:])
    # message itself
    print(message)
    # arguments for str.format()0
    print(arguments)
    # shows that arguments have correct indexes
    for index, value in enumerate(arguments):
        print("{}: {}".format(index, value))
    # and amount of placeholders == amount of arguments
    print("Amount of placeholders: {}, Amount of variables: {}".format(message.count('{}'), len(arguments)))

    # But this still fails! Why?
    print(type(arguments))
    print(message.format(*arguments))

log("First: {}, Second: {}, Third: {}, Fourth: {}", "asdasd", "ddsdd", "12312333", "fdfdf")  

0

试试这个

print(message.format(*arguments))

format 不接受元组


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接