2017-06-17 84 views
-1

基本问题无法导入功能名称

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

更新基于评论

我(愚蠢)命名的文件 “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) 

这不起作用。而且它不起作用,因为当我尝试运行tic_tac_toe.py时,from/import会导致“无法导入名称min_max_player”。

解决方法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

欢迎来到Python,这很可能是您试图实现的循环导入,也是耦合的症状。祝你好运! – hurturk

+0

是mix_max还是min_max,请检查您的导入语句并更新 – Stack

+0

@Stack好点!我错误地命名了文件'mix_max.py'(令人尴尬)。我会更新这个问题。因此,调用“mix_max”的导入是正确的,但是,我更新了代码以使用正确的文件名。所以同样的错误仍然适用。 –

回答

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