Python 无法导入函数名

Python 无法导入函数名,python,Python,基本问题 我得到一个名称导入错误,但两个文件之间的方式不一致。我可以将名称从文件A导入文件B,但不能反过来导入 根据评论进行更新 我(愚蠢地)将文件命名为“mix_max.py”而不是“min_max.py”。我已经相应地更改了文件并更新了GitHub repo。我还更新了问题中的代码以反映这一点 上下文和代码 我没有在这里复制所有的代码,而是做了一个回购来展示我所说的 我有以下min_max.py文件: 您可以在其中看到要从tic_tac_toe导入的行: from tic_tac_toe

基本问题

我得到一个名称导入错误,但两个文件之间的方式不一致。我可以将名称从文件A导入文件B,但不能反过来导入

根据评论进行更新

我(愚蠢地)将文件命名为“mix_max.py”而不是“min_max.py”。我已经相应地更改了文件并更新了GitHub repo。我还更新了问题中的代码以反映这一点

上下文和代码

我没有在这里复制所有的代码,而是做了一个回购来展示我所说的

我有以下min_max.py文件:

您可以在其中看到要从tic_tac_toe导入的行:

from tic_tac_toe import available_moves, apply_move, has_winner
这很好,我可以在minu max.py中使用这些函数,比如第74、84和88行

但是,我还有以下tic_tac_toe.py文件:

您会注意到一行以另一种方式执行类似的导入:

from min_max import min_max_player
问题

但是,当我尝试使用它时(参见第126行):

这是行不通的。它不起作用,因为当我尝试运行tic_tac_toe.py时,我的from/import导致“无法导入名称minu max_player”

解决方案1

我发现我可以通过将导入更改为以下方式解决此问题:

import min_max
然后像这样更改代码:

if __name__ == '__main__':
    play_game(random_player, min_max.min_max_player, log=True)
if __name__ == '__main__':
    from min_max import min_max_player
    play_game(random_player, min_max_player, log=True)
这里的关键更改是
min\u max.min\u max\u player

我不明白为什么这是必要的,特别是当我从tic_tac_toe.py导入到min_max.py时,我不必这样做

解决方案2

我显然可以像这样推迟导入:

if __name__ == '__main__':
    play_game(random_player, min_max.min_max_player, log=True)
if __name__ == '__main__':
    from min_max import min_max_player
    play_game(random_player, min_max_player, log=True)
这很有效


我是从Ruby和Java环境来学习Python的,所以我担心我在这里遗漏了一些非常明显的东西。因此,也许我列出的那些“变通方法”实际上就是实际的解决方案?

基于Stack和hurturk的帮助,他们都为我指出了正确的方向(参见他们的评论),看起来我遗漏和/或没有看到的概念是循环引用,也可能是由此产生的竞争条件

因此,我相信我的问题的一个答案是我在原始问题中发布的变通方法

解决方案2主要是推迟导入,例如:

if __name__ == '__main__':
    from min_max import min_max_player
    play_game(random_player, min_max_player, log=True)
我确实觉得奇怪的是,这并没有导致同样的问题,因为“延迟”并不是真正的延迟;假设我在执行的
tic\u tac\u toe.py
的第一行中处理这个问题

老实说,我不确定为什么这两种变通方法都是必然的答案,但它们确实有工作的好处。似乎这只是我的表达方式的问题


我喜欢解决方案2,因为它允许我使用“min_max_player”,类似于我所说的“random_player”。解决方案1迫使我使用“随机\u播放器”和“最小\u最大值。最小\u最大值播放器”。

欢迎使用Python,这很可能是您试图实现的循环导入,也是耦合的症状。祝你好运是mix_max还是min_max,请检查有问题的导入语句并update@Stack说得好!我错误地命名了文件
mix\u max.py
(令人尴尬)。我会更新这个问题。因此,调用“mix_max”的导入是正确的,但是,我已经更新了代码以使用正确的文件名。所以同样的错误仍然存在。好吧,我会尽力解释发生了什么:当你运行tic_tac_toe.py时,它会尝试从minu max导入minu max_播放器。这样做时,它会尝试加载minu max.py,但minu max.py中的第一行实际上是从tic_tac_toe.py导入的,即
从tic_tac_toe导入可用的移动,apply move,有_winner
,因此,现在它尝试从tic_tac_toe导入这些函数,tic_tac_toe仍在从min_max加载,并给出错误信息。