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常用的日期时间处理方法示例
Feb 08 Python
Python类属性与实例属性用法分析
May 09 Python
python发送HTTP请求的方法小结
Jul 08 Python
一些常用的Python爬虫技巧汇总
Sep 28 Python
Python MySQL数据库连接池组件pymysqlpool详解
Jul 07 Python
Python基于matplotlib绘制栈式直方图的方法示例
Aug 09 Python
[原创]pip和pygal的安装实例教程
Dec 07 Python
深入了解Python在HDA中的应用
Sep 05 Python
python 实现二维字典的键值合并等函数
Dec 06 Python
解决Windows下python和pip命令无法使用的问题
Aug 31 Python
解决PyCharm IDE环境下,执行unittest不生成测试报告的问题
Sep 03 Python
python数据库批量插入数据的实现(executemany的使用)
Apr 30 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
德劲1104的电路分析与改良
2021/03/01 无线电
php 截取字符串并以零补齐str_pad() 函数
2011/05/07 PHP
PHPstorm快捷键(分享)
2017/07/17 PHP
js window.onload 加载多个函数的方法
2009/11/02 Javascript
Jquery cookie操作代码
2010/03/14 Javascript
jquery 操作日期、星期、元素的追加的实现代码
2012/02/07 Javascript
浅析javascript 定时器
2014/12/23 Javascript
JavaScript将当前时间转换成UTC标准时间的方法
2015/04/06 Javascript
js点击列表文字对应该行显示背景颜色的实现代码
2015/08/05 Javascript
JavaScript实现定时隐藏与显示图片的方法
2015/08/06 Javascript
JS读取XML文件数据并以table形式显示数据的方法(兼容IE与火狐)
2016/06/02 Javascript
DOM操作原生js 的bug,使用jQuery 可以消除的解决方法
2016/09/04 Javascript
BootstrapValidator超详细教程(推荐)
2016/12/07 Javascript
javascript实现文字无缝滚动效果
2017/08/26 Javascript
vue组件与复用详解
2018/04/08 Javascript
Angular短信模板校验代码
2020/09/23 Javascript
[01:45]2014DOTA2 TI预选赛预选赛 战前探营!
2014/05/21 DOTA
[04:03][TI9趣味短片] 小鸽子茶话会
2019/08/20 DOTA
Django安装配置mysql的方法步骤
2018/10/15 Python
如何在django里上传csv文件并进行入库处理的方法
2019/01/02 Python
Django跨域资源共享问题(推荐)
2020/03/09 Python
用Python自动清理电脑内重复文件,只要10行代码(自动脚本)
2021/01/09 Python
python中Array和DataFrame相互转换的实例讲解
2021/02/03 Python
html5中的input新属性range使用记录
2014/09/05 HTML / CSS
HTML5 Canvas 旋转风车绘制
2017/08/18 HTML / CSS
JavaScript+Canvas实现自定义画板的示例代码
2019/05/13 HTML / CSS
英国家庭珠宝商:T. H. Baker
2018/02/08 全球购物
时尚圣经:The Fashion Bible
2019/03/03 全球购物
什么是lambda函数
2013/09/17 面试题
天网工程实施方案
2014/03/26 职场文书
作文批改评语大全
2014/04/23 职场文书
领导干部群众路线剖析材料
2014/10/09 职场文书
服务行业标语口号
2015/12/26 职场文书
2016年感恩母亲节活动总结
2016/04/01 职场文书
2019奶茶店创业计划书范本!
2019/07/15 职场文书
Vue elementUI表单嵌套表格并对每行进行校验详解
2022/02/18 Vue.js