1. 程式人生 > >Python之IO程式設計——檔案讀寫、StringIO/BytesIO、操作檔案和目錄、序列化

Python之IO程式設計——檔案讀寫、StringIO/BytesIO、操作檔案和目錄、序列化

What is your name? Eric
We'll remember you when you come back, Eric!
否則,輸出將如下:
Welcome back, Eric!

    1.3重構

    你經常會遇到這樣的情況:程式碼能夠正確地執行,但可做進一步的改進——將程式碼劃分為一系列完成具體工作的函式。這樣的過程被稱為重構 。重構讓程式碼更清晰、更易於理解、更容易擴充套件。

    要重構1.2程式碼,可將其大部分邏輯放到一個或多個函式中。1.2程式碼的重點是問候使用者,因此我們將其所有程式碼都放到一個名為greet_user() 的函式中:
import json

  def greet_user():
❶     """問候使用者,並指出其名字"""
      filename = 'username.json'
      try:
          with open(filename) as f_obj:
              username = json.load(f_obj)
      except FileNotFoundError:
          username = input("What is your name? ")
          with open(filename, 'w') as f_obj:
              json.dump(username, f_obj)
              print("We'll remember you when you come back, " + username + "!")
      else:
          print("Welcome back, " + username + "!")


greet_user()
這個程式更清晰些,但函式greet_user() 所做的不僅僅是問候使用者,還在儲存了使用者名稱時獲取它,而在沒有儲存使用者名稱時提示使用者輸入一個。
下面來重構greet_user() ,讓它不執行這麼多工。為此,我們首先將獲取儲存的使用者名稱的程式碼移到另一個函式中:
import json

  def get_stored_username():
❶     """如果儲存了使用者名稱,就獲取它"""
      filename = 'username.json'
      try:
          with open(filename) as f_obj:
              username = json.load(f_obj)
      except FileNotFoundError:
❷         return None
      else:
          return username

  def greet_user():
      """問候使用者,並指出其名字"""
      username = get_stored_username()
❸     if username:
          print("Welcome back, " + username + "!")
      else:
          username = input("What is your name? ")
          filename = 'username.json'
          with open(filename, 'w') as f_obj:
              json.dump(username, f_obj)
              print("We'll remember you when you come back, " + username + "!")

  greet_user()
    新增的函式get_stored_username() 目標明確,❶處的文件字串指出了這一點。如果儲存了使用者名稱,這個函式就獲取並返回它;如果檔案username.json不存在,這個函式就返回None (見❷)。這是一種不錯的做法:函式要麼返回預期的值,要麼返回None ;這讓我們能夠使用函式的返回值做簡單測試。在❸處,如果成功地獲取了使用者名稱,就列印一條歡迎使用者回來的訊息,否則就提示使用者輸入使用者名稱。

    我們還需將greet_user() 中的另一個程式碼塊提取出來:將沒有儲存使用者名稱時提示使用者輸入的程式碼放在一個獨立的函式中:
import json

def get_stored_username():
    """如果儲存了使用者名稱,就獲取它"""
    --snip--

def get_new_username():
    """提示使用者輸入使用者名稱"""
    username = input("What is your name? ")
    filename = 'username.json'
    with open(filename, 'w') as f_obj:
        json.dump(username, f_obj)
    return username


def greet_user():
    """問候使用者,並指出其名字"""
    username = get_stored_username()
    if username:
        print("Welcome back, " + username + "!")
    else:
        username = get_new_username()
        print("We'll remember you when you come back, " + username + "!")


greet_user()
這個最終版本中,每個函式都執行單一而清晰的任務。我們呼叫greet_user() ,它列印一條合適的訊息:要麼歡迎老使用者回來,要麼問候新使用者。為此,它首先呼叫get_stored_username() ,這個函式只負責獲取儲存的使用者名稱(如果儲存了的話),再在必要時呼叫get_new_username() ,這個函式只負責獲取並存儲新使用者的使用者名稱。要編寫出清晰而易於維護和擴充套件的程式碼,這種劃分工作必不可少。