2017-08-10 60 views
1

我在我的項目中使用MVCModule-View-Controller)模式。我想保留我的代碼DRY(不要重複自己),所以我不想再爲另一個輸入編寫get_date函數。如何將函數與特定的輸入傳遞給驗證此輸入的函數? - Python

我使用功能get_date()幾次,但有不同的輸入。我怎樣才能通過這些輸入功能get_date()所以它可以工作?

在這裏,我打電話get_date()功能:

date = get_date(date_input = provide_date()) 

在這裏,我想通過與輸入消息的功能:

def get_date(date_input): 
    ask = True 
    while ask: 
     date_input 
     try: 
      validation = datetime.strptime(date_input, '%Y-%m- 
%d').strftime('%Y-%m-%d') 
      date_list = validation.split('-') 
      correct_date = 
date(int(date_list[0]),int(date_list[1]),int(date_list[2])) 
      return correct_date 
      ask = False 
     except ValueError: 
      wrong_input() 

Provide_date功能是:

def provide_date(): 
    return input('Type date in format Y-M-D: ') 

我有另一個輸入端針對不同的情況,如重新安排其他消息。

如何將此輸入傳遞給get_date()函數,以便它可以在While循環內工作?因爲現在它會在我引發TypeError時永久循環。

+1

有行只是'date_input'什麼都不做。你是否意味着將'date_input'傳遞給函數(而不是'date_input()'),然後在該行上調用'date_input()'?這兩個不相同。 –

+0

@tobias_k是的,正好。我應該怎麼做?輸入必須在While循環內部調用才能正常工作。 – JeyKey

回答

1

有幾個問題與您的代碼:

  • 通話的功能,然後將結果傳遞給get_date;相反,通過函數本身
  • 然後,呼叫get_date的功能,也是結果綁定到某個變量
  • 不需要解析日期,然後格式化,然後再分析它,手動
  • 因爲你從函數返回,不需要在ask變量

試試這個:

def get_date(date_input): 
    while True: 
     inpt = date_input() # add() and bind result to variable 
     try: 
      dt = datetime.strptime(inpt, '%Y-%m-%d') # no need to parse-format-parse 
      return date(dt.year, dt.month, dt.day) # use attributes of parsed datetime 
     except ValueError: 
      wrong_input() 

print(get_date(provide_date)) # no() here 
+0

謝謝@tobias_k的幫助!你是對的。但問題是,我想再次調用get_date(date_input)函數,但使用另一個在函數中定義的輸入: def date_for_reschedule_event(): return input('輸入要重新計劃的事件的日期: ') 如何將這些函數與輸入傳遞給get_date()函數,所以我不必再爲另一個輸入編寫get_date()函數? – JeyKey

+0

@JeyKey我不明白這個問題。只需傳遞函數(函數本身,而不是調用函數的結果),就像我在答案中所做的一樣,即'get_date(date_for_reschedule_event)' –

+0

對不起@tobias_k。我沒有看到你在第三行代碼中調用了這個函數,你通過了。該功能的名稱誤導了我。現在一切都很好,)謝謝你的幫助! – JeyKey

相關問題