Ошибка IndexError: замена индекса 2 вне диапазона для кортежа позиционных аргументов

#python #python-3.x

#python #python-3.x

Вопрос:

 class Exercise:
    def __init__(self, *args):
        self.args = args

    def format(self, mode):
        if mode == "order":
            return "{2} - {1} - {0}".format(*self.args)

ex = Exercise()
s = ex.format('order').format('third', 'second', 'first')
print(s)
  

Я попытался запустить этот код, но он вернул ошибку, как указано в названии. Что я здесь делаю не так?

Комментарии:

1. Мне непонятно, как вы ожидаете, что это будет работать. Вы не можете связывать вызовы методов и предполагать, что он будет помнить «что-то» (например, состояние) между вызовами

Ответ №1:

Вы форматируете с self.args format() помощью метода.

             return "{2} - {1} - {0}".format(*self.args)
  

Но вы не передали ни args одного инициализатору:

 ex = Exercise()
  

И при вызове этого метода вы вызываете format возвращаемое значение этого метода:

 s = ex.format('order').format('third', 'second', 'first')
  

Что эффективно:

 "{2} - {1} - {0}".format([])
  

Что приводит к ошибке. Вы должны передать аргументы формата инициализатору класса:

 ex = Exercise('third', 'second', 'first')
s = ex.format('order')
print(s)
  

В качестве альтернативы, чтобы заставить код работать, вы можете сделать это:

 class Exercise:

    def format(self, mode):
        if mode == "order":
            return "{2} - {1} - {0}"
  

Который должен работать с остальной частью вашего кода без изменений

Комментарии:

1. Почему вы создали этот метод, а не использовали __repr__ or __str__ ?

2. Ну, я почти уверен, что они этого не делают, потому что они связывают вызовы методов, которые ничего не возвращают

3. Но это был не тот вопрос, который они задавали.

4. Есть ли способ заставить это работать, только внеся изменения в метод? Это учебный материал, которому я следую, и в нем говорится, что s = ex.format('order').format('third', 'second', 'first') он должен возвращать результат first - second - third

Ответ №2:

Вам нужно передать аргументы формата инициализатору класса, вот как должен быть ваш код :

 class Exercise:
def __init__(self, *args):
    self.args = args

def format(self, mode):
    if mode == "order":
        return "{} - {} - {}".format(*self.args)
ex = Exercise('third', 'second', 'first')
s = ex.format('order')
print(s)