如何传递可选功能参数

时间:2018-09-20 07:31:20

标签: python function arguments

我目前正在学习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 :(得分:2)

您的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 中引用它,因为在实际调用函数之前,body不会执行。

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

答案 1 :(得分:1)

作为@khelwood答案的替代方法,如果您希望将lambda保持为default_layout类的静态方法,则也可以使用Board函数。

更改:

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

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