Python ellipsis 的用法詳解
背景
在 Python 的基本類型中單例模式的值有三個 None 類型的 None ,NotImplemented 類型的 NotImplemented, Ellipsis 類型的 ... 。
None 已經(jīng)用的爛大街了,NotImplemented 也比較常用,唯獨 ... 在江湖上只知它是三巨頭之一,但不知其用法。
Ellipsis
Ellipsis 在 python 中代表“省略”,用現(xiàn)在的流形語來表達(dá)就是“老鐵,不要在意這些細(xì)節(jié)!”。哪什么時候要告訴別人不要在意這些細(xì)節(jié)呢?其中的一個場景就是隨機值。
用于文檔測試
假設(shè)我們編寫了一個類,要想知道這個有沒有語法層面的錯誤,只要簡單的調(diào)用一下就能測試出來。為了把這個測試自動化,于是做成了文檔測試。
#!/usr/bin/evn python3
class Person(object):
"""人類類型
Parameters:
----------
name: str
age: int
Return:
------
>>> Person()
<main.Person object at 0x7ff36c1ca250>
"""
name = ''
age = 0
def __init__(self, name: str = 'tom', age: int = 10) -> 'Person':
"""初始化
"""
self.name = name
self.age = age
def say_hello(self) -> str:
"""返回打招呼信息
"""
return f"Hello My name is {self.name} ."
當(dāng)我們運行測試用例時會報錯,原因是每次創(chuàng)建的對象,它的內(nèi)存地址并不等于測試用例中指定的哪個,而我們的用例上寫死了。誠然這個問題用 unittest 可以解決,但是這個不是這里要講的。
python3 -m doctest main.py -v Trying: Person() Expecting: <main.Person object at 0x7ff36c1ca250> ********************************************************************** File "/private/tmp/main.py", line 12, in main.Person Failed example: Person() Expected: <main.Person object at 0x7ff36c1ca250> Got: <main.Person object at 0x7fe4e078ac70> 3 items had no tests: main main.Person.__init__ main.Person.say_hello ********************************************************************** 1 items had failures: 1 of 1 in main.Person 1 tests in 4 items. 0 passed and 1 failed. ***Test Failed*** 1 failures.
哪如何才能告訴 doctest 這位老鐵不要在意返回值細(xì)節(jié)呢?答案是加上 Ellipsis 這個指令,改造后的代碼如下。
#!/usr/bin/evn python3
class Person(object):
"""人類類型
Parameters:
----------
name: str
age: int
Return:
------
>>> Person() #doctest: +ELLIPSIS
<main.Person object at 0x...>
"""
name = ''
age = 0
def __init__(self, name: str = 'tom', age: int = 10) -> 'Person':
"""初始化
"""
self.name = name
self.age = age
def say_hello(self) -> str:
"""返回打招呼信息
"""
return f"Hello My name is {self.name} ."
運行測試用例這下可以通過了。
python3 -m doctest main.py -v Trying: Person() #doctest: +ELLIPSIS Expecting: <main.Person object at 0x...> ok 3 items had no tests: main main.Person.__init__ main.Person.say_hello 1 items passed all tests: 1 tests in main.Person 1 tests in 4 items. 1 passed and 0 failed. Test passed.
其它
如果我們是為模塊添加測試用例,那么可以這樣做,會方便一些。
#!/usr/bin/evn python3
class Person(object):
"""人類類型
Parameters:
----------
name: str
age: int
Return
------
>>> Person() #doctest: +ELLIPSIS
<...Person object at 0x...>
"""
name = ''
age = 0
def __init__(self, name: str = 'tom', age: int = 10) -> 'Person':
"""初始化
"""
self.name = name
self.age = age
def say_hello(self) -> str:
"""返回打招呼信息
"""
return f"Hello My name is {self.name} ."
if __name__ == "__main__":
# 因為在模塊在被 import 的時候 __name__ 直接等于 模塊名 不等于 “__main__” ,所以在作為模塊被導(dǎo)入時并不會執(zhí)行測試用例
# 如果想執(zhí)行測試用例直接執(zhí)行模塊就行
import doctest
doctest.testmod()
以上就是Python ellipsis 的用法詳解的詳細(xì)內(nèi)容,更多關(guān)于Python ellipsis的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
matplotlib調(diào)整子圖間距,調(diào)整整體空白的方法
今天小編就為大家分享一篇matplotlib調(diào)整子圖間距,調(diào)整整體空白的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08
Python+Selenium+PIL+Tesseract自動識別驗證碼進(jìn)行一鍵登錄
本篇文章主要介紹了Python+Selenium+PIL+Tesseract自動識別驗證碼進(jìn)行一鍵登錄,具有一定的參考價值,有興趣的可以了解下2017-09-09
python 中的list和array的不同之處及轉(zhuǎn)換問題
python中的list是python的內(nèi)置數(shù)據(jù)類型,list中的數(shù)據(jù)類不必相同的,而array的中的類型必須全部相同。這篇文章給大家介紹了python 中的list和array的不同之處及轉(zhuǎn)換問題,需要的朋友參考下吧2018-03-03
Python實現(xiàn)將json格式數(shù)據(jù)存儲到Mysql數(shù)據(jù)庫
這篇文章主要為大家詳細(xì)介紹了如何使用Python實現(xiàn)將json格式數(shù)據(jù)存儲到Mysql數(shù)據(jù)庫,文中的示例代碼簡潔易懂,有需要的小伙伴可以參考下2025-03-03
pycharm中代碼回滾到指定版本的兩種實現(xiàn)方法(附帶截圖展示)
在編寫代碼的時候,經(jīng)常會出現(xiàn)寫的代碼存在一些問題,但是比較難以發(fā)現(xiàn)具體存在的問題在哪里,需要將帶代碼恢復(fù)到指定的版本,下面這篇文章主要給大家介紹了關(guān)于pycharm中代碼回滾到指定版本的兩種實現(xiàn)方法,需要的朋友可以參考下2022-06-06
Pygame游戲開發(fā)之太空射擊實戰(zhàn)添加圖形篇
相信大多數(shù)8090后都玩過太空射擊游戲,在過去游戲不多的年代太空射擊自然屬于經(jīng)典好玩的一款了,今天我們來自己動手實現(xiàn)它,在編寫學(xué)習(xí)中回顧過往展望未來,在本課中,我們將討論如何在游戲中使用預(yù)先繪制的圖形2022-08-08

