'объект' не может быть подписан в списке 2d python - PullRequest
0 голосов
/ 15 апреля 2020

Сообщение = объект 'SodokuGame' не может быть подписан
Source = C: \ Users \ PC \ Desktop \ python \ Soduku \ Soduku \ Soduku.py
StackTrace: File "C : \ Users \ PC \ Desktop \ python \ Soduku \ Soduku \ Soduku.py ", строка 31, в fillArray, если currentArray [x] [y] .value == 0:

Файл" C: \ Users \ PC \ Desktop \ python \ Soduku \ Soduku \ Soduku.py ", строка 110, в init game.fillArray (game.matrix, 0, 0, game.newPool) файл" C : \ Users \ PC \ Desktop \ python \ Soduku \ Soduku \ Soduku.py ", строка 113, в Run ()

Я пробовал собственный проект и столкнулся с проблемой. Для начала у меня есть класс сотовой связи. Моя цель - проверить данные в Cell и запустить код в зависимости от результатов, но во время выполнения я столкнулся с ошибкой, приведенной выше.

class Cell:
    value = 0
    def __getitem__(self):
        return self.value
    def __setitem__(newVal, self):
        self.value = newVal

Так я определил и попытался добавить свой список

class SodokuGame:

    matrix = []
    for i in range(9):
        arr = []
        for j in range(9):
            arr.append(Cell())
        matrix.append(arr)

    def fillArray(currentArray, x, y, pool, self):
        if currentArray[x][y].value == 0:
            print("fillArray loop") #unimportant context code from here on
            poolNum = randint(0, pool.length)
            if testNumber(pool[poolNum]):
                currentArray[x][y]= pool.pop(pool[poolNum])
                print(poolNum)

Мое первое предположение состояло в том, что массив был заполнен неправильно, чтобы не выполнить оператор if, но это не проблема. Я полагаю, что проблема во время

if currentArray[x][y].value == 0:

каким-то образом, даже когда я инстанцировал все узлы в (x, y), он все еще дает мне ошибку, как будто я сравниваю объект SodukuGame с 0 .

Как это называется изначально:

class Run:
    def __init__(self):
        print("Run")
        game = SodokuGame()
        game.printGrid()
        game.fillArray(game.matrix, 0, 0, game.newPool)
        game.printGrid()
Run()

Примечания: я не думаю, что это имеет отношение к вопросу, но цель этой функции - проверить, пуста ли текущая ячейка ( = 0), а если нет, он попытается заполнить ячейку и рекурсивно запустить функцию, снова перемещаясь по одной ячейке, пока структура не заполнится.

Я пытался реализовать методы в классе Cell, чтобы Обойти это, включая добавление функции __getitem__, встроенной функции getInfo и даже пытаться использовать логическую функцию isZero, но все это приводит к одной и той же ошибке. Это не для домашней работы.

1 Ответ

0 голосов
/ 16 апреля 2020

Добро пожаловать, Джастин. Здесь есть несколько проблем, но первая заключается в том, что вы не запускаете методы экземпляра с self. Python все еще рассматривает эти переменные как self, поэтому вы получаете сообщение об ошибке «SodokuGame не является подпиской». Это не подписка на матрицу, которую вы передаете; он подписывает инстанцированный объект самого класса SodokuGame.

Вот как должен выглядеть fillArray метод класса SodokuGame

class SodokuGame:
    def fillArray(self, currentArray, x, y, pool):
      if currentArray[x][y].value == 0:
        # do stuff

Вы заметите, что я поставил self в списке аргументов, что вам всегда нужно делать. Python не слушает, куда вы положили self, потому что технически вы можете назвать его как угодно (не следует, но вы можете). Это просто первый аргумент в методе экземпляра.

После этого у вас возникнут проблемы с Cell. Вы реализуете __getitem__, но у Cell нет массива для индексации. Если вы действительно хотите использовать его, но по какой-то причине всегда возвращаете одно и то же значение, вам нужно правильно реализовать метод (то же самое относится и к __setitem__):

class Cell:
    value = 0
    def __getitem__(self, item):
        return self.value
    def __setitem__(self, item, value):
        self.value = value

, если вы на самом деле не хотите для индексации Cell, т.е. вы не хотите делать

c = Cell()
c[247321] = 2
# 247321 can literally be anything; 'turkey', 12, 32.1, etc.
# that is what item is in the __getitem__ and __setitem__ methods, and
# you're not using that argument in the implementations

, вы, вероятно, не должны использовать __getitem__, а скорее делать что-то вроде:

class Cell:
    def get_value(self):
        return self.value
    def set_value(self, value):
        self.value = value

, но ваш метод доступ к собственности напрямую с .value также работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...