基本问题
我收到名称导入错误,但不是两个文件之间一致的方式。我可以将文件A中的名称导入文件B,但不是相反。
根据评论进行更新
我(愚蠢地)将文件命名为#34; mix_max.py"而不是" min_max.py"。我已相应更改了文件并更新了GitHub仓库。我还更新了我的问题中的代码以反映这一点。
上下文和代码
我没有在这里复制所有代码,而是制作了一个回购来展示我正在谈论的内容。
我有以下 min_max.py 文件:
https://github.com/jeffnyman/tic_tac_toe/blob/master/min_max.py
您可以在其中看到要从tic_tac_toe导入的行:
from tic_tac_toe import available_moves, apply_move, has_winner
这很好用,我可以在 min_max.py 中使用这些功能,例如第74,84和88行。
但是,我还有以下 tic_tac_toe.py 文件:
https://github.com/jeffnyman/tic_tac_toe/blob/master/tic_tac_toe.py
您会注意到一条相反导入类似行的行:
from min_max import min_max_player
问题
然而,当我尝试使用它时(见第126行):
if __name__ == '__main__':
play_game(random_player, min_max_player, log=True)
这不起作用。并且它不起作用,因为我的/ from导致"无法导入名称min_max_player"当我尝试运行tic_tac_toe.py时。
解决方法1
我发现我可以通过将导入更改为此来解决此问题:
import min_max
然后像这样更改代码:
if __name__ == '__main__':
play_game(random_player, min_max.min_max_player, log=True)
关键变化有min_max.min_max_player
。
我不知道为什么这是必要的,特别是因为从 tic_tac_toe.py 导入到时我没有必要这样做min_max.py。
解决方法2
我显然可以推迟这样的导入:
if __name__ == '__main__':
from min_max import min_max_player
play_game(random_player, min_max_player, log=True)
有效。
我从Ruby和Java环境中来到Python,所以我担心我在这里遗漏了一些非常明显的东西。也许那些我列出的东西是"变通方法"事实上,这是实际的解决方案吗?
答案 0 :(得分:0)
基于Stack和hurturk的帮助,他们都指出了我正确的方向(见他们的评论),看起来我错过和/或没有看到的概念是循环引用以及可能的竞争条件从中。
所以我相信我的问题的一个答案是我在原始问题中发布的变通办法。
解决方法2主要是推迟导入,因此:
if __name__ == '__main__':
from min_max import min_max_player
play_game(random_player, min_max_player, log=True)
我确实觉得奇怪的是,这并不会导致同样的问题,因为“延迟”并非真正推迟;鉴于我在tic_tac_toe.py
的第一行中处理了这个问题。
老实说,我不确定为什么这两种解决办法都是必然的答案,但他们确实有工作的好处。似乎这只是我所拥有的表达方式的问题。
我喜欢解决方法2,因为它允许我使用类似于我称之为“random_player”的“min_max_player”。解决方法1强制我使用“random_player”和“min_max.min_max_player”。