Ошибка функции в классе: TypeError: function () отсутствует 1 обязательный позиционный аргумент: - PullRequest
1 голос
/ 19 июня 2020

Я относительно новичок в программировании с Python. Этот код работал отлично, пока я не попытался превратить его в класс. Я делаю класс для своего кода решателя судоку, чтобы практиковать классы и увлекаться объектно-ориентированным программированием.

Итак, я прочитал целую кучу вопросов от пользователей, у которых возникла аналогичная проблема, большинство ответов были: -создать сначала класс перед вызовом функции из указанного класса, но ни один из них, похоже, не работает для моей спецификации c пример.

Вот мой класс:

#assume sudoku is imported as a np.array, white spaces replaced by zeros


class Sudoku():

    solution_number = 1

    def __init__ (self, sud_arr):
        self.sudo = sud_arr

    #print(self.sudo)

    def possible (self, y, x, num):
        for i in range(9):
            if self.sudo[y][i] == num:
                return False
            if self.sudo[i][x] == num:
                return False
            yy = (y//3)*3
            xx = (x//3)*3
            for i in range(3):
                for j in range(3):
                    if self.sudo[yy+i][xx+j] == num:
                        return False
        return True


    def solve(self):
        for i in range(9):
            for j in range(9):
                if self.sudo[i][j] == 0:
                    for nr in range(1,10):
                         if Sudoku.possible(i,j,nr): #line 34
                            self.sudo[i][j] = nr
                            Sudoku.solve()
                            self.sudo[i][j] = 0
                    return
        if Sudoku.solution_number > 1:  #if there is more than one solution, include solution number
            print("Solution Number {}".format(Sudoku.solution_number))
        else: print("Solution Number 1")
        print(self.sudo)                                  
        Sudoku.add_sol_num()

    @classmethod
    def add_sol_num(cls):           
        cls.solution_number += 1

После запуска:

s = Sudoku(su) #where su is a numpy array sudoku
s.solve() #line 52

Я получаю сообщение об ошибке:

  File "/Users/georgesvanheerden/Python/Projects/Sudoku/SudokuSolver.py", line 52, in <module>
    s.solve()
  File "/Users/georgesvanheerden/Python/Projects/Sudoku/SudokuSolver.py", line 34, in solve
    if Sudoku.possible(i,j,nr):
TypeError: possible() missing 1 required positional argument: 'num'
[Finished in 1.9s with exit code 1]

Извините если это слишком много кода, я не знал, какие части вырезать.

Ответы [ 4 ]

1 голос
/ 19 июня 2020

используйте self.possible при использовании метода, Sudoku.possible дает вам ссылку на этот метод, который не может найти экземпляр, из которого вы его вызываете.

Это также относится к if Sudoku.solution_number > 1, обычно pythoni c способ - использовать переменную self или первый аргумент метода (хотя вы также можете передать self функции: Solution.possible(self, i, j , nr))

Итак, ваш код будет выглядеть как :

    def solve(self):
        for i in range(9):
            for j in range(9):
                if self.sudo[i][j] == 0:
                    for nr in range(1,10):
                         if self.possible(i,j,nr): #line 34
                            self.sudo[i][j] = nr
                            self.solve()
                            self.sudo[i][j] = 0
                    return
        if self.solution_number > 1:  #if there is more than one solution, include solution number
            print("Solution Number {}".format(self.solution_number))
        else: print("Solution Number 1")
        print(self.sudo)                                  
        Sudoku.add_sol_num() # add_sol_num is a @classmethod
0 голосов
/ 19 июня 2020

В строках 34 и 36 вы вызываете два метода, как если бы они были c методами stati, поскольку вы вызываете методы в классе, а не в каком-то экземпляре. Это также причина того, почему self не распознается и, следовательно, запрашивается другой параметр при вызове метода. Вы хотите вызвать методы текущего экземпляра судоку. Следовательно,

if self.possible(i,j,nr):

в строке 34 и

self.solve()

в строке 36 должны помочь.

0 голосов
/ 19 июня 2020

Давайте сначала разберемся с выдаваемой ошибкой:

TypeError: possible() missing 1 required positional argument: 'num'

Это говорит о том, что нет значения аргумента num при вызове метода possible().

Но здесь вы передаете 3 аргумента:

if Sudoku.possible(i,j,nr)

Итак, что здесь пошло не так ???

Если вы видите определение вашего метода:

def possible (self, y, x, num):

Это говорит о том, что вы будете передавать 4 аргумента, один из которых будет экземпляром / объектом класса (self аргумент).

1. If we invoke this method using a class object, `self` argument is passed by default. So in this case we can just send 3 arguments apart from `self`.

2. If you want to invoke this method like you have done above, you will have to provide a value for  `self` argument explicitally.

Итак, здесь вот как вы можете это сделать (способ pythoni c и хороший подход): при вызове метода используйте ключевое слово self.

if self.possible(i,j,nr):
0 голосов
/ 19 июня 2020

вы можете добавить себя в качестве первого аргумента:

if Sudoku.possible(self, i, j, nr):  #line 34
...