2017-06-17 85 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」。