Python ellipsis 的用法详解


Posted in Python onNovember 20, 2020

背景

在 Python 的基本类型中单例模式的值有三个 None 类型的 None ,NotImplemented 类型的 NotImplemented, Ellipsis 类型的 ... 。

None 已经用的烂大街了,NotImplemented 也比较常用,唯独 ... 在江湖上只知它是三巨头之一,但不知其用法。

Ellipsis

Ellipsis 在 python 中代表“省略”,用现在的流形语来表达就是“老铁,不要在意这些细节!”。哪什么时候要告诉别人不要在意这些细节呢?其中的一个场景就是随机值。

用于文档测试

假设我们编写了一个类,要想知道这个有没有语法层面的错误,只要简单的调用一下就能测试出来。为了把这个测试自动化,于是做成了文档测试。

#!/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} ."

当我们运行测试用例时会报错,原因是每次创建的对象,它的内存地址并不等于测试用例中指定的哪个,而我们的用例上写死了。诚然这个问题用 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 这位老铁不要在意返回值细节呢?答案是加上 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__” ,所以在作为模块被导入时并不会执行测试用例
  # 如果想执行测试用例直接执行模块就行
  import doctest
  doctest.testmod()

以上就是Python ellipsis 的用法详解的详细内容,更多关于Python ellipsis的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python网络编程学习笔记(九):数据库客户端 DB-API
Jun 09 Python
python检查序列seq是否含有aset中项的方法
Jun 30 Python
关于Django ForeignKey 反向查询中filter和_set的效率对比详解
Dec 15 Python
python3对拉勾数据进行可视化分析的方法详解
Apr 03 Python
Python机器学习算法库scikit-learn学习之决策树实现方法详解
Jul 04 Python
Python 实现的 Google 批量翻译功能
Aug 26 Python
Python matplotlib绘制饼状图功能示例
Sep 10 Python
Python使用tkinter模块实现推箱子游戏
Oct 08 Python
Python 过滤错误log并导出的实例
Dec 26 Python
如何使用Python抓取网页tag操作
Feb 14 Python
Python爬虫之爬取淘女郎照片示例详解
Jul 28 Python
如何利用Python实现n*n螺旋矩阵
Jan 18 Python
python 动态渲染 mysql 配置文件的示例
Nov 20 #Python
Python paramiko使用方法代码汇总
Nov 20 #Python
分享一枚pycharm激活码适用所有pycharm版本我的pycharm2020.2.3激活成功
Nov 20 #Python
python使用requests库爬取拉勾网招聘信息的实现
Nov 20 #Python
python爬取天气数据的实例详解
Nov 20 #Python
python爬取招聘要求等信息实例
Nov 20 #Python
python爬虫判断招聘信息是否存在的实例代码
Nov 20 #Python
You might like
星际争霸中的热键
2020/03/04 星际争霸
将一维或多维的数组连接成一个字符串的php代码
2010/08/08 PHP
PHP和Mysqlweb应用开发核心技术-第1部分 Php基础-2 php语言介绍
2011/07/03 PHP
第六章 php目录与文件操作
2011/12/30 PHP
php实现网站留言板功能
2015/11/04 PHP
PHP判断函数是否被定义的方法
2019/06/21 PHP
在IE模态窗口中自由查看HTML源码的方法
2007/03/08 Javascript
js操作Xml(向服务器发送Xml,处理服务器返回的Xml)(IE下有效)
2009/01/30 Javascript
Google的跟踪代码 动态加载js代码方法应用
2012/11/12 Javascript
javascript数组去重方法终极总结
2014/06/05 Javascript
js实现跨域的4种实用方法原理分析
2015/10/29 Javascript
js重写方法的简单实现
2016/07/10 Javascript
AngularJs  unit-testing(单元测试)详解
2016/09/02 Javascript
Angular项目从新建、打包到nginx部署全过程记录
2017/12/09 Javascript
jQuery md5加密插件jQuery.md5.js用法示例
2018/08/24 jQuery
深入理解NodeJS 多进程和集群
2018/10/17 NodeJs
javascriptvoid(0)含义以及与&quot;#&quot;的区别讲解
2019/01/19 Javascript
vue-router的两种模式的区别
2019/05/30 Javascript
解决Vue的项目使用Element ui 走马灯无法实现的问题
2020/08/03 Javascript
js+css3实现炫酷时钟
2020/08/18 Javascript
详解vue3.0 的 Composition API 的一种使用方法
2020/10/26 Javascript
Vue使用Proxy代理后仍无法生效的解决
2020/11/13 Javascript
[34:56]Ti4冒泡赛LGD vs Liquid 1
2014/07/14 DOTA
python网络编程学习笔记(八):XML生成与解析(DOM、ElementTree)
2014/06/09 Python
python中字符串前面加r的作用
2015/06/04 Python
举例讲解Python编程中对线程锁的使用
2016/07/12 Python
Python实现桶排序与快速排序算法结合应用示例
2017/11/22 Python
Python创建一个元素都为0的列表实例
2019/11/28 Python
canvas绘制圆角头像的实现方法
2019/01/17 HTML / CSS
Html5之自定义属性(data-,dataset)
2019/11/19 HTML / CSS
中专生自荐信
2013/10/12 职场文书
计算机科学与技术应届生求职信
2013/11/07 职场文书
公司同意接收函
2014/01/13 职场文书
小小的船教学反思
2014/02/21 职场文书
2014入党积极分子批评与自我批评思想汇报
2014/09/20 职场文书
Python中异常处理用法
2021/11/27 Python