Как передать необязательный параметр функции - PullRequest
0 голосов
/ 20 сентября 2018

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

class Board:

    def __init__(self):
        self._reset()

    def _reset(self, func=Board.default_layout):
        self.values = [[0 for x in range(8)] for i in range(8)]
        self.currentPlayer = 1
        func(self.values)

    @staticmethod
    def default_layout(values):
        pass


if __name__ == "__main__":
    b = Board()

Идея метода сброса состоит в том, чтобы сбросить плату.Фишки на нем будут удалены, и будет вызвана функция, которая помещает фишки на доску в исходную раскладку.

Существуют шахматные версии, в которых существуют разные стартовые раскладки.Поэтому я хотел сделать его необязательным параметром с методом по умолчанию: default_layout(self)

Однако этот код не компилируется, и я хотел бы знать, где моя проблема.

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

NameError: name 'default_layout' is not defined 

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

В качестве альтернативы ответу @ khelwood вы также можете использовать вместо него функцию lambda, если предпочитаете сохранять default_layout статическим методом класса Board.

Изменение:

def _reset(self, func=Board.default_layout):

до

def _reset(self, func=lambda values: Board.default_layout(values)):
0 голосов
/ 20 сентября 2018

Ваш def _reset(self, func=Board.default_layout): оценивается как часть определения Board, поэтому Board.default_layout еще не определено.

Вы можете сделать default_layout обычной функцией вместо статического метода.Он должен быть определен перед использованием.

def default_layout(values):
    ... whatever

class Board:
    ...
    def _reset(self, func=default_layout):
        ...

Или, если должен быть статическим методом, не пытайтесь ссылаться на него внутри объявления функции.Вы можете ссылаться на него внутри функции body , потому что тело не выполняется, пока функция не будет вызвана.

    def _reset(self, func=None):
        if func is None:
            func = Board.default_layout
...