代码之家  ›  专栏  ›  技术社区  ›  Finn Eggers

如何传递可选函数参数

  •  -1
  • Finn Eggers  · 技术社区  · 7 年前

    我目前正在学习python并尝试实现chess。 (我已经用多种不同的语言完成了)

    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 回复  |  直到 7 年前
        1
  •  2
  •   khelwood Muhammed Elsayed.radwan    7 年前

    你的 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):
            ...
    

    或者,如果 作为一个静态方法,不要尝试在函数声明中引用它。您可以在函数中引用它 身体 ,因为直到函数真正被调用时,主体才被执行。

        def _reset(self, func=None):
            if func is None:
                func = Board.default_layout
    
        2
  •  1
  •   blhsing    7 年前

    作为@khelwood答案的替代方法,您还可以使用 lambda 如果你想保持 default_layout 静态方法 Board 班级。

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

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