【问题标题】:IndexError: tuple index out of range when parsing method argumentsIndexError:解析方法参数时元组索引超出范围
【发布时间】:2017-05-28 16:06:07
【问题描述】:

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

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

PS:我已经拒绝使用这种方法(包装str.format()),因为它似乎是多余的。但它仍然让我感到困惑,为什么这不能按预期工作?

【问题讨论】:

    标签: python string-formatting


    【解决方案1】:

    您必须使用* 将元组解包为format 的实际参数:

    print(message.format(*arguments))
    

    否则,arguments 被视为格式的唯一参数(它适用于第一次出现的{},通过将元组转换为字符串,但遇到第二次出现的{} 时会阻塞)

    【讨论】:

      【解决方案2】:

      您需要传递参数而不是元组。这是通过使用'*arguments'来完成的。 Expanding tuples into 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")  
      

      【讨论】:

        【解决方案3】:

        试试这个

        print(message.format(*arguments))
        

        format 不需要元组

        【讨论】:

          猜你喜欢
          • 2013-07-28
          • 2018-11-16
          • 2017-07-12
          • 2013-12-16
          • 2021-12-21
          • 2014-08-01
          • 2021-04-19
          • 1970-01-01
          相关资源
          最近更新 更多