2009-08-26 71 views
1

我正在使用Python來自動化一個複雜的程序,它有很少的選項。 我想在python中有以下結構。 - 一個包含流程的「流程類」 - 一個包含大量「黑匣子」(常常不會更改的功能)的幫助類。Python設計模式,交叉導入

99%的時間,我在flow-class中修改了一些東西,所以我只想要那些經常修改的代碼,所以我不必滾動很多來找到我想要修改的代碼。該類還包含經常發生變化的全局變量(配置設置)。助手類包含不經常改變的全局變量。

在流程類中,我有一個全局變量,我希望用戶在每次運行時都被強制輸入。這條線看起來像這樣。 打印(「你想看到調試輸出(輸入=否)?」) 調試= getUserInput()

的getUserInput()函數應設在輔助類,因爲它永遠不會改變。 getUserInput需要flow類中的全局變量,它指示用戶輸入是否應與Linux命令行或Eclipse(在Windows上運行)保持一致。

我的問題是:我怎樣才能以最好的方式來構造這個?目前,它看起來如下: 流量級:

import helper_class 

isLinux = 1 

debug = getUserInput() 

助手類:

import os, flow_class 

def getUserInput(): 
    userInput = input() 
    if (flow_class.isLinux == 1): 
     userInput = userInput[:-1] 
    return userInput 

目前這給了我下面的錯誤由於交叉進口:

Traceback (most recent call last): 
    File "flow_class.py", line 1, in <module> 
    import helper_class 
    File "helper_class.py", line 1, in <module> 
    import os, flow_class 
    File "flow_class.py", line 5, in <module> 
    debug = getUserInput() 
NameError: name 'getUserInput' is not defined 

我知道我明顯可以通過將isLinux作爲getUserInput的參數來解決這個問題,但是這使得這個方法的使用變得複雜,並且使得它更不直觀。

回答

1

我知道,我能明顯的總是傳遞isLinux作爲參數傳遞給getUserInput解決這個問題,但是這個複雜這種方法的使用,並且使得它不太直觀。

實際上使用全局變量會使程序的使用複雜化,而不僅僅是一個簡單的參數。

嘗試類似:

debug = getUserInput(isLinux=True) 

下面是一些其他的建議

  • 你提到有很多的,你會經常改變的參數。這些應該是硬編碼?嘗試使用a configuration file,或者將'flow'中的dict()作爲參數傳遞。這樣你就可以在不需要潛入的情況下改變常見變量的中心位置!
  • 你的'流動/助手'類聽起來像一個Controller/Model範例。這很好。但是你的模型不應該導入你的控制器。

這些不是特定於'pythonic風格'的建議,這些是一般的編程實踐。如果您關心程序設計,請嘗試閱讀The Pragmatic Programmer,他們對工作流程和設計有很棒的提示。羅伯託建議的還有Code Complete

+0

只要每個方法的參數少於5個,參數就很好,如果有多個參數則需要其他參數。 「 」參數意味着經常更改,但不能被硬編碼,請嘗試使用配置文件。「我看不到如何使用配置文件改變一般設計問題。 非常感謝「控制器/模型」文章的鏈接,我會仔細研究它。 – David 2009-08-26 12:10:08

+0

如果您確實有很多參數,或者它們與某個區域相關(因此可以分組爲一個消息傳遞對象),您可能有太多的功能。 – 2009-08-26 17:26:57

1

我想問你最後一句話。

通常,如CC2中概述的,全局變量的使用有助於編寫代碼,但不能讀取它。
代碼被讀取的次數比寫入次數多;在你的情況下,我知道你一遍又一遍修改相同的腳本。

您現在面臨的問題只是通用設計決定使用全局變量的結果。
顯式參數傳遞將使它更清晰,更容易維護。

正如在Python的禪中所說的,explicit is better than implicit

+0

* Random Haiku * 只需鍵入'import this' 啊,Python的禪宗。這是簡潔明瞭的 。 – 2009-08-28 12:03:55

2

您需要在您的flow_class中做helper_class.getUserIinput()。這不是關於交叉導入。一旦修復,你會得到AttributeError,這確實與交叉導入有關。

在這個階段,您需要實現在導入flow_class之前定義的獲取getUserInput的邏輯。

並對你最後的陳述發表評論:你的假設是不正確的。如果使用明確的本地值,代碼會更清晰。

+0

謝謝。我已更新我的代碼並獲取與交叉導入相關的相應錯誤消息。 實現邏輯來獲得在正確的地方定義的函數似乎是一個糟糕的設計指示。 – David 2009-08-26 12:12:02

+0

它不是。 – SilentGhost 2009-08-26 12:54:15

+0

這樣的邏輯看起來像什麼?你的意思是否是陳述? – David 2009-08-26 16:26:53