【问题标题】:How to pass optional function parameter如何传递可选函数参数
【发布时间】:2018-09-20 07:31:19
【问题描述】:

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

reset 方法的思想是重置板子。上面的棋子将被移除,并调用一个函数将棋子放在棋盘上的初始布局中。

有国际象棋版本,其中有不同的起始布局。因此,我想使用默认方法使其成为可选参数:default_layout(self)

但是这段代码无法编译,我想知道我的问题出在哪里。

我收到错误消息:

NameError: name 'default_layout' is not defined 

【问题讨论】:

  • 您是否收到某种错误消息?
  • 是的... NameError: name 'default_layout' is not defined

标签: python function arguments


【解决方案1】:

您的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

【讨论】:

  • 谢谢! python是否从上到下定义事物?因为如果函数 default_layout 写在类之后,这将不起作用。
  • 哦,好吧,这就解释了。感谢您的回答!我会尽快接受。
【解决方案2】:

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

变化:

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

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

【讨论】:

  • 这是一个很好的解决方案!谢谢你:)
猜你喜欢
  • 1970-01-01
  • 2011-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多