Python基础入门知识(11)
接前面的文章:
Python基礎(chǔ)入門(mén)教學(xué)
- 2 Python的基礎(chǔ)知識(shí)
- 2.15 文件和異常
- 2.15.4 存儲(chǔ)數(shù)據(jù)
- 2.15.4.1 使用json.dump()和json.load()
- 2.15.4.2 保存和讀取用戶生成的數(shù)據(jù)
- 2.15.4.3 重構(gòu)
- 2.16 測(cè)試代碼
- 2.16.1 測(cè)試函數(shù)
- 2.16.1.1 單元測(cè)試和測(cè)試用例
- 2.16.1.2 可通過(guò)的測(cè)試
- 2.16.1.3 不能通過(guò)的測(cè)試
- 2.16.1.4 測(cè)試未通過(guò)時(shí)怎么辦
- 2.16.1.5 添加新測(cè)試
2 Python的基礎(chǔ)知識(shí)
2.15 文件和異常
2.15.4 存儲(chǔ)數(shù)據(jù)
很多程序都要求用戶輸入某種信息,如讓用戶存儲(chǔ)游戲首選項(xiàng)或提供要可視化的數(shù)據(jù)。不管專注的是什么,程序都把用戶提供的信息存儲(chǔ)在列表和字典等數(shù)據(jù)結(jié)構(gòu)中。用戶關(guān)閉程序時(shí),我們幾乎總是要保存他們提供的信息;一種簡(jiǎn)單的方式是使用模塊json來(lái)存儲(chǔ)數(shù)據(jù)。
模塊json讓我們能夠?qū)⒑?jiǎn)單的Python數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)儲(chǔ)到文件中,并在程序再次運(yùn)行時(shí)加載該文件中的數(shù)據(jù)。我們還可以使用json在Python程序之間分享數(shù)據(jù)。更重要的是,JSON數(shù)據(jù)格式并非Python專用的,這讓我們能夠?qū)⒁訨SON格式存儲(chǔ)的數(shù)據(jù)與使用其他編程語(yǔ)言的人分享。這是一種輕便格式,很有用,也易于學(xué)習(xí)。
- 注意:JSON(JavaScript Object Notation)格式最初是為JavaScript開(kāi)發(fā)的,但隨后成了一種常見(jiàn)格式,被包括Python在內(nèi)的眾多語(yǔ)言采用。
2.15.4.1 使用json.dump()和json.load()
我們來(lái)編寫(xiě)一個(gè)存儲(chǔ)一組數(shù)字的簡(jiǎn)短程序,再編寫(xiě)一個(gè)將這些數(shù)字讀取到內(nèi)存中的程序。第一個(gè)程序?qū)⑹褂胘son.dump()來(lái)存儲(chǔ)這組數(shù)字,而第二個(gè)程序?qū)⑹褂胘son.load()。
函數(shù)json.dump()接受兩個(gè)實(shí)參:要存儲(chǔ)的數(shù)據(jù)以及可用于存儲(chǔ)數(shù)據(jù)的文件對(duì)象。下面演示了如何使用json.dump()來(lái)存儲(chǔ)數(shù)字列表:
number_writer.py
我們先導(dǎo)入模塊json,再創(chuàng)建一個(gè)數(shù)字列表。在?處,我們指定了要將該數(shù)字列表存儲(chǔ)到其中的文件的名稱。通常使用文件擴(kuò)展名.json來(lái)指出文件存儲(chǔ)的數(shù)據(jù)為JSON格式。接下來(lái),我們以寫(xiě)入模式打開(kāi)這個(gè)文件,讓json能夠?qū)?shù)據(jù)寫(xiě)入其中(見(jiàn)?)。在?處,我們使用函數(shù)json.dump()將數(shù)字列表存儲(chǔ)到文件numbers.json中。
這個(gè)程序沒(méi)有輸出,但我們可以打開(kāi)文件numbers.json,看看其內(nèi)容。數(shù)據(jù)的存儲(chǔ)格式與Python中一樣:
下面再編寫(xiě)一個(gè)程序,使用json.load()將這個(gè)列表讀取到內(nèi)存中:
number_reader.py
在?處,我們確保讀取的是前面寫(xiě)入的文件。這次我們以讀取方式打開(kāi)這個(gè)文件,因?yàn)镻ython只需讀取這個(gè)文件(見(jiàn)?)。在?處,我們使用函數(shù)json.load()加載存儲(chǔ)在numbers.json中的信息,并將其存儲(chǔ)到變量numbers中。最后,我們打印恢復(fù)的數(shù)字列表,看看它是否與number_writer.py中創(chuàng)建的數(shù)字列表相同:
[2, 3, 5, 7, 11, 13]這是一種在程序之間共享數(shù)據(jù)的簡(jiǎn)單方式。
2.15.4.2 保存和讀取用戶生成的數(shù)據(jù)
對(duì)于用戶生成的數(shù)據(jù),使用json保存它們大有裨益,因?yàn)槿绻灰阅撤N方式進(jìn)行存儲(chǔ),等程序停止運(yùn)行時(shí)用戶的信息將丟失。下面來(lái)看一個(gè)這樣的例子:用戶首次運(yùn)行程序時(shí)被提示輸入自己的名字,這樣再次運(yùn)行程序時(shí)就記住他了。
我們先來(lái)存儲(chǔ)用戶的名字:
remember_me.py
在?處,我們提示輸入用戶名,并將其存儲(chǔ)在一個(gè)變量中。接下來(lái),我們調(diào)用json.dump(),并將用戶名和一個(gè)文件對(duì)象傳遞給它,從而將用戶名存儲(chǔ)到文件中(見(jiàn)?)。然后,我們打印一條消息,指出我們存儲(chǔ)了他輸入的信息(見(jiàn)?):
Whit is your name? shirley We'll remember you when you come back, shirley!現(xiàn)在再編寫(xiě)一個(gè)程序,向其名字被存儲(chǔ)的用戶發(fā)出問(wèn)候:
greet_user.py
在?處,我們使用json.load()將存儲(chǔ)在username.json中的信息讀取到變量username中?;謴?fù)用戶名后,我們就可以歡迎用戶回來(lái)了(見(jiàn)?):
Welcome back,shirley!我們需要將這兩個(gè)程序合并到一個(gè)程序(remember_me.py)中。這個(gè)程序運(yùn)行時(shí),我們將嘗試從文件username.json中獲取用戶名,因此我們首先編寫(xiě)一個(gè)嘗試恢復(fù)用戶名的try代碼塊。如果這個(gè)文件不存在,我們就在except代碼塊中提示用戶輸入用戶名,并將其存儲(chǔ)在username.json中,以便程序再次運(yùn)行時(shí)能夠獲取它:
remember_me.py
這里沒(méi)有任何新代碼,只是將前兩個(gè)示例的代碼合并到了一個(gè)程序中。在?處,我們嘗試打開(kāi)文件username.json。如果這個(gè)文件存在,就將其中的用戶名讀取到內(nèi)存中(見(jiàn)?),再執(zhí)行else代碼塊,即打印一條歡迎用戶回來(lái)的消息。用戶首次運(yùn)行這個(gè)程序時(shí),文件username.json不存在,將引發(fā)FileNotFoundError異常(見(jiàn)?),因此Python將執(zhí)行except代碼塊:提示用戶輸入其用戶名(見(jiàn)?),再使用json.dump()存儲(chǔ)該用戶名,并打印一句問(wèn)候語(yǔ)(見(jiàn)?)。
無(wú)論執(zhí)行的是except代碼塊還是else代碼塊,都將顯示用戶名和合適的問(wèn)候語(yǔ)。如果這個(gè)程序是首次運(yùn)行,輸出將如下:
否則,輸出將如下:
Welcome back,shirley!這是程序之前至少運(yùn)行了一次時(shí)的輸出。
2.15.4.3 重構(gòu)
我們經(jīng)常會(huì)遇到這樣的情況:代碼能夠正確地運(yùn)行,但可做進(jìn)一步的改進(jìn)——將代碼劃分為一系列完成具體工作的函數(shù)。這樣的過(guò)程被稱為重構(gòu)。重構(gòu)讓代碼更清晰、更易于理解、更容易擴(kuò)展。
要重構(gòu)remember_me.py,可將其大部分邏輯放到一個(gè)或多個(gè)函數(shù)中。remember_me.py的重點(diǎn)是問(wèn)候用戶,因此我們將其所有代碼都放到一個(gè)名為greet_user()的函數(shù)中:
remember_me.py
考慮到現(xiàn)在使用了一個(gè)函數(shù),我們刪除了注釋,轉(zhuǎn)而使用一個(gè)文檔字符串來(lái)指出程序是做什么的(見(jiàn)?)。這個(gè)程序更清晰些,但函數(shù)greet_user()所做的不僅僅是問(wèn)候用戶,還在存儲(chǔ)了用戶名時(shí)獲取它,而在沒(méi)有存儲(chǔ)用戶名時(shí)提示用戶輸入一個(gè)。
下面來(lái)重構(gòu)greet_user(),讓它不執(zhí)行這么多任務(wù)。為此,我們首先將獲取存儲(chǔ)的用戶名的代碼移到另一個(gè)函數(shù)中:
新增的函數(shù)get_stored_username()目標(biāo)明確,?處的文檔字符串指出了這一點(diǎn)。如果存儲(chǔ)了用戶名,這個(gè)函數(shù)就獲取并返回它;如果文件username.json不存在,這個(gè)函數(shù)就返回None(見(jiàn)?)。這是一種不錯(cuò)的做法:函數(shù)要么返回預(yù)期的值,要么返回None;這讓我們能夠使用函數(shù)的返回值做簡(jiǎn)單測(cè)試。在?處,如果成功地獲取了用戶名,就打印一條歡迎用戶回來(lái)的消息,否則就提示用戶輸入用戶名。
我們還需將greet_user()中的另一個(gè)代碼塊提取出來(lái):將沒(méi)有存儲(chǔ)用戶名時(shí)提示用戶輸入的代碼放在一個(gè)獨(dú)立的函數(shù)中:
在remember_me.py的這個(gè)最終版本中,每個(gè)函數(shù)都執(zhí)行單一而清晰的任務(wù)。我們調(diào)用greet_user(),它打印一條合適的消息:要么歡迎老用戶回來(lái),要么問(wèn)候新用戶。為此,它首先調(diào)用get_stored_username(),這個(gè)函數(shù)只負(fù)責(zé)獲取存儲(chǔ)的用戶名(如果存儲(chǔ)了的話),再在必要時(shí)調(diào)用get_new_username(),這個(gè)函數(shù)只負(fù)責(zé)獲取并存儲(chǔ)新用戶的用戶名。要編寫(xiě)出清晰而易于維護(hù)和擴(kuò)展的代碼,這種劃分工作必不可少。
2.16 測(cè)試代碼
編寫(xiě)函數(shù)或類時(shí),還可為其編寫(xiě)測(cè)試。通過(guò)測(cè)試,可確定代碼面對(duì)各種輸入都能夠按要求的那樣工作。測(cè)試讓我們信心滿滿,深信即便有更多的人使用我們的程序,它也能正確地工作。在程序中添加新代碼時(shí),我們也可以對(duì)其進(jìn)行測(cè)試,確認(rèn)它們不會(huì)破壞程序既有的行為。程序員都會(huì)犯錯(cuò),因此每個(gè)程序員都必須經(jīng)常測(cè)試其代碼,在用戶發(fā)現(xiàn)問(wèn)題前找出它們。
2.16.1 測(cè)試函數(shù)
要學(xué)習(xí)測(cè)試,得有要測(cè)試的代碼。下面是一個(gè)簡(jiǎn)單的函數(shù),它接受名和姓并返回整潔的姓名:name_function.py
def get_formatted_name(first, last):"""Generate a neatly formatted full name."""full_name = first+' '+lastreturn full_name.title()函數(shù)get_formatted_name()將名和姓合并成姓名,在名和姓之間加上一個(gè)空格,并將它們的首字母都大寫(xiě),再返回結(jié)果。為核實(shí)get_formatted_name()像期望的那樣工作,我們來(lái)編寫(xiě)一個(gè)使用這個(gè)函數(shù)的程序。程序names.py讓用戶輸入名和姓,并顯示整潔的全名:
names.py
這個(gè)程序從name_function.py中導(dǎo)入get_formatted_name()。用戶可輸入一系列的名和姓,并看到格式整潔的全名:
Enter 'q' at any time to quit.'Please give me a first name: janis Please give me a last name: joplinNeatly formatted name: Janis Joplin.Please give me a first name: bob Please give me a last name: dylanNeatly formatted name: Bob Dylan.Please give me a first name: q從上述輸出可知,合并得到的姓名正確無(wú)誤?,F(xiàn)在假設(shè)我們要修改get_formatted_name(),使其還能夠處理中間名。這樣做時(shí),我們要確保不破壞這個(gè)函數(shù)處理只有名和姓的姓名的方式。為此,我們可以在每次修改get_formatted_name()后都進(jìn)行測(cè)試:運(yùn)行程序names.py,并輸入像JanisJoplin這樣的姓名,但這太煩瑣了。所幸Python提供了一種自動(dòng)測(cè)試函數(shù)輸出的高效方式。倘若我們對(duì)get_formatted_name()進(jìn)行自動(dòng)測(cè)試,就能始終信心滿滿,確信給這個(gè)函數(shù)提供我們測(cè)試過(guò)的姓名時(shí),它都能正確地工作。
2.16.1.1 單元測(cè)試和測(cè)試用例
Python標(biāo)準(zhǔn)庫(kù)中的模塊unittest提供了代碼測(cè)試工具。
單元測(cè)試用于核實(shí)函數(shù)的某個(gè)方面沒(méi)有問(wèn)題;
測(cè)試用例是一組單元測(cè)試,這些單元測(cè)試一起核實(shí)函數(shù)在各種情形下的行為都符合要求。良好的測(cè)試用例考慮到了函數(shù)可能收到的各種輸入,包含針對(duì)所有這些情形的測(cè)試。
全覆蓋式測(cè)試用例包含一整套單元測(cè)試,涵蓋了各種可能的函數(shù)使用方式。對(duì)于大型項(xiàng)目,要實(shí)現(xiàn)全覆蓋可能很難。通常,最初只要針對(duì)代碼的重要行為編寫(xiě)測(cè)試即可,等項(xiàng)目被廣泛使用時(shí)再考慮全覆蓋。
2.16.1.2 可通過(guò)的測(cè)試
創(chuàng)建測(cè)試用例的語(yǔ)法需要一段時(shí)間才能習(xí)慣,但測(cè)試用例創(chuàng)建后,再添加針對(duì)函數(shù)的單元測(cè)試就很簡(jiǎn)單了。要為函數(shù)編寫(xiě)測(cè)試用例,可先導(dǎo)入模塊unittest以及要測(cè)試的函數(shù),再創(chuàng)建一個(gè)繼承unittest.TestCase的類,并編寫(xiě)一系列方法對(duì)函數(shù)行為的不同方面進(jìn)行測(cè)試。
下面是一個(gè)只包含一個(gè)方法的測(cè)試用例,它檢查函數(shù)get_formatted_name()在給定名和姓時(shí)能否正確地工作:
test_name_function.py
首先,我們導(dǎo)入了模塊unittest和要測(cè)試的函數(shù)get_formatted_name()。在?處,我們創(chuàng)建了一個(gè)名為NamesTestCase的類,用于包含一系列針對(duì)get_formatted_name()的單元測(cè)試。我們可隨便給這個(gè)類命名,但最好讓它看起來(lái)與要測(cè)試的函數(shù)相關(guān),并包含字樣Test。這個(gè)類必須繼承unittest.TestCase類,這樣Python才知道如何運(yùn)行我們編寫(xiě)的測(cè)試。
NamesTestCase只包含一個(gè)方法,用于測(cè)試get_formatted_name()的一個(gè)方面。我們將這個(gè)方法命名為test_first_last_name(),因?yàn)槲覀円藢?shí)的是只有名和姓的姓名能否被正確地格式化。我們運(yùn)行testname_function.py時(shí),所有以test打頭的方法都將自動(dòng)運(yùn)行。在這個(gè)方法中,我們調(diào)用了要測(cè)試的函數(shù),并存儲(chǔ)了要測(cè)試的返回值。在這個(gè)示例中,我們使用實(shí)參’janis’和’joplin’調(diào)用get_formatted_name(),并將結(jié)果存儲(chǔ)到變量formatted_name中(見(jiàn)?)。
在?處,我們使用了unittest類最有用的功能之一:一個(gè)斷言方法。斷言方法用來(lái)核實(shí)得到的結(jié)果是否與期望的結(jié)果一致。在這里,我們知道get_formatted_name()應(yīng)返回這樣的姓名,即名和姓的首字母為大寫(xiě),且它們之間有一個(gè)空格,因此我們期望formatted_name的值為Janis Joplin。為檢查是否確實(shí)如此,我們調(diào)用unittest的方法assertEqual(),并向它傳遞formatted_name和’Janis Joplin’。代碼行self.assertEqual(formatted_name, ‘Janis Joplin’)的意思是說(shuō):“將formatted_name的值同字符串’Janis Joplin’進(jìn)行比較,如果它們相等,就萬(wàn)事大吉,如果它們不相等,跟我說(shuō)一聲!”
代碼行unittest.main()讓Python運(yùn)行這個(gè)文件中的測(cè)試。運(yùn)行test_name_function.py時(shí),得到的輸出如下:
第1行的句點(diǎn)表明有一個(gè)測(cè)試通過(guò)了。接下來(lái)的一行指出Python運(yùn)行了一個(gè)測(cè)試,消耗的時(shí)間不到0.001秒。最后的OK表明該測(cè)試用例中的所有單元測(cè)試都通過(guò)了。上述輸出表明,給定包含名和姓的姓名時(shí),函數(shù)get_formatted_name()總是能正確地處理。修改get_formatted_name()后,可再次運(yùn)行這個(gè)測(cè)試用例。如果它通過(guò)了,我們就知道在給定Janis Joplin這樣的姓名時(shí),這個(gè)函數(shù)依然能夠正確地處理。
2.16.1.3 不能通過(guò)的測(cè)試
測(cè)試未通過(guò)時(shí)結(jié)果是什么樣的呢?我們來(lái)修改get_formatted_name(),使其能夠處理中間名,但這樣做時(shí),故意讓這個(gè)函數(shù)無(wú)法正確地處理像Janis Joplin這樣只有名和姓的姓名。
下面是函數(shù)get_formatted_name()的新版本,它要求通過(guò)一個(gè)實(shí)參指定中間名:
這個(gè)版本應(yīng)該能夠正確地處理包含中間名的姓名,但對(duì)其進(jìn)行測(cè)試時(shí),我們發(fā)現(xiàn)它再也不能正確地處理只有名和姓的姓名。這次運(yùn)行程序test_name_function.py時(shí),輸出如下:
E ? ====================================================================== ERROR: test_first last_name(_main_.NamesTestCase) ? Traceback (most recent call last): ?File"test_name_function.py",line 8,in test_first_last_nameformatted name = get_formatted_name('janis','joplin') TypeError: get_formatted_name() missing 1 required positional argumen t:'last" ---------------------------------------------------------------------- Ran 1 test in 0. 000s ? FAILED(errors=1) ?其中包含的信息很多,因?yàn)闇y(cè)試未通過(guò)時(shí),需要讓我們知道的事情可能有很多。第1行輸出只有一個(gè)字母E(見(jiàn)?),它指出測(cè)試用例中有一個(gè)單元測(cè)試導(dǎo)致了錯(cuò)誤。接下來(lái),我們看到NamesTestCase中的test_first_last_name()導(dǎo)致了錯(cuò)誤(見(jiàn)?)。測(cè)試用例包含眾多單元測(cè)試時(shí),知道哪個(gè)測(cè)試未通過(guò)至關(guān)重要。在?處,我們看到了一個(gè)標(biāo)準(zhǔn)的traceback,它指出函數(shù)調(diào)用get_formatted_name(‘janis’,‘joplin’)有問(wèn)題,因?yàn)樗鄙僖粋€(gè)必不可少的位置實(shí)參。
我們還看到運(yùn)行了一個(gè)單元測(cè)試(見(jiàn)?)。最后,還看到了一條消息,它指出整個(gè)測(cè)試用例都未通過(guò),因?yàn)檫\(yùn)行該測(cè)試用例時(shí)發(fā)生了一個(gè)錯(cuò)誤(見(jiàn)?)。這條消息位于輸出末尾,讓我們一眼就能看到——我們可不希望為獲悉有多少測(cè)試未通過(guò)而翻閱長(zhǎng)長(zhǎng)的輸出。
2.16.1.4 測(cè)試未通過(guò)時(shí)怎么辦
測(cè)試未通過(guò)時(shí)怎么辦呢?如果我們檢查的條件沒(méi)錯(cuò),測(cè)試通過(guò)了意味著函數(shù)的行為是對(duì)的,而測(cè)試未通過(guò)意味著我們編寫(xiě)的新代碼有錯(cuò)。因此,測(cè)試未通過(guò)時(shí),不要修改測(cè)試,而應(yīng)修復(fù)導(dǎo)致測(cè)試不能通過(guò)的代碼:檢查剛對(duì)函數(shù)所做的修改,找出導(dǎo)致函數(shù)行為不符合預(yù)期的修改。
在這個(gè)示例中,get_formatted_name()以前只需要兩個(gè)實(shí)參——名和姓,但現(xiàn)在它要求提供名、中間名和姓。新增的中間名參數(shù)是必不可少的,這導(dǎo)致get_formatted_name()的行為不符合預(yù)期。就這里而言,最佳的選擇是讓中間名變?yōu)榭蛇x的。這樣做后,使用類似于Janis Joplin的姓名進(jìn)行測(cè)試時(shí),測(cè)試就會(huì)通過(guò)了,同時(shí)這個(gè)函數(shù)還能接受中間名。下面來(lái)修改get_formatted_name(),將中間名設(shè)置為可選的,然后再次運(yùn)行這個(gè)測(cè)試用例。如果通過(guò)了,我們接著確認(rèn)這個(gè)函數(shù)能夠妥善地處理中間名。
要將中間名設(shè)置為可選的,可在函數(shù)定義中將形參middle移到形參列表末尾,并將其默認(rèn)值指定為一個(gè)空字符串。我們還要添加一個(gè)if測(cè)試,以便根據(jù)是否提供了中間名相應(yīng)地創(chuàng)建姓名:
在get_formatted_name()的這個(gè)新版本中,中間名是可選的。如果向這個(gè)函數(shù)傳遞了中間名(if middle:),姓名將包含名、中間名和姓,否則姓名將只包含名和姓?,F(xiàn)在,對(duì)于兩種不同的姓名,這個(gè)函數(shù)都應(yīng)該能夠正確地處理。為確定這個(gè)函數(shù)依然能夠正確地處理像Janis Joplin這樣的姓名,我們?cè)俅芜\(yùn)行test_name_function.py:
. ---------------------------------------------------------------------- Ran 1 tests in 0.000sOK現(xiàn)在,測(cè)試用例通過(guò)了。太好了,這意味著這個(gè)函數(shù)又能正確地處理像JanisJoplin這樣的姓名了,而且我們無(wú)需手工測(cè)試這個(gè)函數(shù)。這個(gè)函數(shù)很容易就修復(fù)了,因?yàn)槲赐ㄟ^(guò)的測(cè)試讓我們得知新代碼破壞了函數(shù)原來(lái)的行為。
2.16.1.5 添加新測(cè)試
確定get_formatted_name()又能正確地處理簡(jiǎn)單的姓名后,我們?cè)倬帉?xiě)一個(gè)測(cè)試,用于測(cè)試包含中間名的姓名。為此,我們?cè)贜amesTestCase類中再添加一個(gè)方法:
import unittest from name_function import get_formatted_name class NamesTestCase(unittest.TestCase):"""測(cè)試name_function.py"""def test_first_last_name(self):"""能夠正確地處理像Janis Joplin這樣地姓名嗎?"""formatted_name = get_formatted_name('janis', 'joplin')self.assertEqual(formatted_name,'Janis Joplin')def test_first_last_middle_name(self):"""能夠正確地處理像Wolfgang Amadeus Mozart這樣的姓名嗎?"""formatted_name = get_formatted_name( ?'wolfgang','mozart','amadeus')self.assertEqual(formatted_name,'Wolfgang Amadeus Mozart') unittest.main()我們將這個(gè)方法命名為test_first_last_middle_name()。方法名必須以test_打頭,這樣它才會(huì)在我們運(yùn)行test_name_function.py時(shí)自動(dòng)運(yùn)行。這個(gè)方法名清楚地指出了它測(cè)試的是get_formatted_name()的哪個(gè)行為,這樣,如果該測(cè)試未通過(guò),我們就會(huì)馬上知道受影響的是哪種類型的姓名。在TestCase類中使用很長(zhǎng)的方法名是可以的;這些方法的名稱必須是描述性的,這才能讓我們明白測(cè)試未通過(guò)時(shí)的輸出;這些方法由Python自動(dòng)調(diào)用,我們根本不用編寫(xiě)調(diào)用它們的代碼。
為測(cè)試函數(shù)get_formatted_name(),我們使用名、姓和中間名調(diào)用它(見(jiàn)?),再使用assertEqual()檢查返回的姓名是否與預(yù)期的姓名(名、中間名和姓)一致。我們?cè)俅芜\(yùn)行test_name_function.py時(shí),兩個(gè)測(cè)試都通過(guò)了:
太好了!現(xiàn)在我們知道,這個(gè)函數(shù)又能正確地處理像Janis Joplin這樣的姓名了,我們還深信它也能夠正確地處理像Wolfgang Amadeus Mozart這樣的姓名。
后續(xù)更新:
總結(jié)
以上是生活随笔為你收集整理的Python基础入门知识(11)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Mac 开发工具汇总
- 下一篇: python爬虫分析模拟登录时会变的参数