2017-10-15 64 views
0

我希望這個問題很有意義,我一直在努力弄清楚這兩個完整的日子。Python中的每個實例的輸入,測試和輸出結果

我想創建一個非常小的腳本,然後我可以將其轉換爲Flask Web應用程序,以便比較SPECint處理器分數。

一點背景:

從specint.org,我可以下載包含有關處理器和他們的服務器基準的基準信息的CSV文件。我的應用程序的想法是做到以下幾點:

  1. 向用戶提供他們所需要的基準(CINT或者RINT),服務器 模型,以及他們感興趣的處理器必須這樣做 兩次,服務器1和服務器2,所以我可以比較它們。

  2. 我需要檢查,他們正在進入的信息是正確的,即 如果有人爲處理器名稱XYZ進入它應該引發 錯誤,並提示輸入一個有效的查詢。爲此,我計劃 將整個數據庫的一個版本轉儲到我自己的數據庫中,因此我可以在從服務器上實際下載 的csv文件之前執行檢查。

  3. 如果輸入的信息是有效的,我會動態生成正確的url用於下載和直接從SPECint的服務器讀取包含基準評分信息的csv文件。

  4. 一旦我已經下載並處理了兩臺服務器的信息,我會應用一些簡單的數學運算並返回結果,如下所示:「服務器1比服務器2快10%」或類似的東西。

正如你可能想象的那樣,這將需要很多重複的代碼,所以它似乎是一個類的完美用例。我一直在進行一些測試,結果很有希望。

但是,我的問題是,我一直無法弄清楚如何捕獲用戶輸入,測試輸入,下載相應的csv文件,並且按照每個實例的方式傳遞用戶輸入,而無需在某處複製代碼。我一直在尋找和搜索,似乎@classmethod是我需要的,但我不確定,因爲它的使用仍然似乎對我來說很深奧(我是一個新手)(參考:Example of Class with User Input

例如,這是有點兒工作:

我的類:

class Baseline: 
    def __init__(self, benchmark, model, processor): 
     self.benchmark = benchmark 
     self.model = model 
     self.processor = processor 

捕獲並打印實例結果。

old_server = inputs.Baseline(test=input("Select benchmark: "), 
          model=input("Enter model: "), 
          processor=input("Enter processor: ") 
          ) 
new_server = inputs.Baseline(test=input("Select benchmark: "), 
          model=input("Enter model: "), 
          processor=input("Enter processor: ") 
          ) 

print(old_server.benchmark) 
print(old_server.model) 
print(new_server.benchmark) 
print(new_server.model) 

正如你所看到的,我已經重複的代碼,而是,我想從類中所做的一切,所以我可以簡單地調用它的實例來捕撈,測試,下載,並返回結果。正如我剛纔所說,似乎@classmethod是答案,但我會很感激任何指導,希望有一些示例代碼,以便我可以完全掌握這些概念。

回答

0

這是一個長期的問題,所以我希望我正確地按照你的意思,如果我這樣做,你可以這樣做:

class BaseLine(object): 
    @classmethod 
    def run(cls): 
     benchmark = raw_input('Enter benchmark please: ') 
     model = raw_input('Enter model please: ') 
     processor = raw_input('Enter processor please: ') 

     yes_no = raw_input('you picked %s, %s, %s - are you sure? (y/n) ' % (benchmark, model, processor)) 

     if yes_no.lower() == 'y': 
      print('Great Sucess!') 
      return benchmark, model, processor 
     else: 
      return cls.run() 

如果你的主要將是這樣的:

benchmark1, model1, processor1 = BaseLine.run() 
benchmark2, model2, processor2 = BaseLine.run() 

這是一個簡化的例子,根據你做的檢查以及你如何構造你的代碼,你應該設計是否使用類方法或實例方法(self)。如果你的實例有一個狀態,並且你的等價物run使用該狀態(例如與數據庫的連接),那麼它應該是一個實例方法。

+0

乾杯烏里。我會試試這個,還有@ nutmeg64的回答,並檢查哪一個最適合我的用例。我會報告回來,一旦我認爲這一切:) –

0

你可以這樣做:

class Baseline: 
    def __init__(self): 
     self.benchmark = input("Select benchmark: ") 
     self.model = input("Enter model: ") 
     self.processor = input("Enter processor: ") 

這將使你的代碼少重複創建新實例是:

old_server = inputs.Baseline() 
new_server = inputs.Baseline() 

旁註還可以實現__str__方法來打印全部輸出:

def __str__(self): 
    return '\n'.join(str(item) for item in self.__dict__.values()) 

,然後打印很簡單:

print(old_server) 

作爲一般的建議,我不會對用戶的「免費」的處理器型號和標準輸入,因爲大多數時候它包含小寫的混合物,大寫字母數字等數

我會做什麼,特別是因爲你說你想使用Flask(所以這會變得更簡單),它只能縮小到你僅支持的處理器型號和基準。這意味着下拉列表列表在您的應用程序和setlist的模型,基準等。這也將爲您節省輸入驗證的麻煩。

如果不是所有的模型都帶有所有的基準,你可以使用dict做一些記錄。 但是如果記賬變得越來越複雜,可以考慮使用class es來進行「自動」記帳。那麼這些類可以是pickled,jsonified和其他將它們保存到數據庫中的方法。

如果你分享更多的代碼,我們可以幫助更多一點。 無論如何,我建議你在code review上發佈這個問題以進行更深入的分析。

+0

這使得很多道理。我會嘗試一下代碼並閱讀你的建議。我沒有更多的代碼可供分享,不幸的是,迄今爲止唯一缺少的代碼是csv閱讀器功能。我特別喜歡你的實施建議,因爲我需要這個。爲所有選項創建下拉列表並不是真的可行,因爲它們太多了,但按照您的建議劃分它們是一個非常好的主意。我是新手,所以我不得不在這裏做一些功課。一旦我有至少半功能的東西,我會把它提交給代碼審查。乾杯! –

相關問題