无法导入函数名称

时间:2017-06-17 16:37:04

标签: python

基本问题

我收到名称导入错误,但不是两个文件之间一致的方式。我可以将文件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,所以我担心我在这里遗漏了一些非常明显的东西。也许那些我列出的东西是"变通方法"事实上,这是实际的解决方案吗?

1 个答案:

答案 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”。