在Python作业中,我必须完成以下两个功能:
move(board, move)
undomove(board, move)
有一个与函数同名的参数对我来说似乎是一个坏习惯。我已经联系过教授来改变它,但出于好奇,可以从move
内部调用undomove
函数,还是在move
上使用递归?在这些函数中,move
引用了参数。
(Python 3,如果重要的话)
答案 0 :(得分:3)
你可以对move
(该功能)进行处理,但是需要一些额外的体操。
def move(move):
print(move,"inside move")
def undomove(move):
print (move,"inside undomove")
this_mod =__import__(__name__)
this_mod.move(move)
if __name__ == '__main__':
move(1)
undomove(2)
一般来说,我肯定会避免使用与该函数中需要的函数同名的局部变量命名。
就样式而言,创建函数def move(move): ...
肯定有点奇怪,它会让随意的读者认为你正在尝试编写一个递归函数,所以我绝对会避免这种情况。当undomove(move)
已经在模块作用域中定义为函数时写move
稍微不那么奇怪,但它仍然可能会在快速浏览时引起混淆(它是一个局部变量吗?它是函数吗?所以我也可能会避开那个。
答案 1 :(得分:2)
这里有很多选项,但排除最简单的(重命名move
),还有其他一些。
首先,您可以为该函数创建另一个名称,以便在move
被覆盖时使用该名称:
def move(...):
...
move_ = move
def undomove(..., move):
move_(...)
这适用于Python中的函数就像任何其他对象一样 - 所以你可以将它们分配给变量。
另一种选择是将函数放在一个类中,因此它们位于命名空间中 - 这意味着您将方法作为self.move()
访问,参数作为move
。也就是说,如果您的分配要求函数是顶级的,那么这不是一个选项。
答案 2 :(得分:2)
您可以通过move
(或任何其他功能)中的globals()['move']
来调用功能undomove
。不是很优雅......