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 网络编程起步(Socket发送消息)
Sep 06 Python
Python生成验证码实例
Aug 21 Python
python 异常处理总结
Oct 18 Python
Python中最大最小赋值小技巧(分享)
Dec 23 Python
tensorflow建立一个简单的神经网络的方法
Feb 10 Python
Linux下python3.6.1环境配置教程
Sep 26 Python
python斐波那契数列的计算方法
Sep 27 Python
python的常用模块之collections模块详解
Dec 06 Python
python单线程下实现多个socket并发过程详解
Jul 27 Python
python 字典套字典或列表的示例
Dec 16 Python
python实现IOU计算案例
Apr 12 Python
深入理解pytorch库的dockerfile
Jun 10 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
PHP fopen 读取带中文URL地址的一点见解
2012/09/25 PHP
解析mysql中UNIX_TIMESTAMP()函数与php中time()函数的区别
2013/06/24 PHP
PHP实现文件上传和多文件上传
2015/12/24 PHP
Symfony2学习笔记之插件格式分析
2016/03/17 PHP
怎么让脚本或里面的函数在所有图片都载入完毕的时候执行
2006/10/17 Javascript
在页面上点击任一链接时触发一个事件的代码
2007/04/07 Javascript
如何确保JavaScript的执行顺序 之jQuery.html并非万能钥匙
2011/03/03 Javascript
javascript模拟的Ping效果代码 (Web Ping)
2011/03/13 Javascript
Jsonp 跨域的原理以及Jquery的解决方案
2011/06/27 Javascript
E3 tree 1.6在Firefox下显示问题的修复方法
2013/01/30 Javascript
百度地图api应用标注地理位置信息(js版)
2013/02/01 Javascript
Js Jquery创建一个弹出层可加载一个页面
2014/05/08 Javascript
浅谈JavaScript的Polymer框架中的behaviors对象
2015/07/29 Javascript
JS给Textarea文本框添加行号的方法
2015/08/20 Javascript
Javascript 实现简单计算器实例代码
2016/10/23 Javascript
微信小程序 页面之间传参实例详解
2017/01/13 Javascript
laravel5.4+vue+element简单搭建的示例代码
2017/08/29 Javascript
jQuery实现注册会员时密码强度提示信息功能示例
2017/09/05 jQuery
vue项目中监听手机物理返回键的实现
2020/01/18 Javascript
vue data变量相互赋值后被实时同步的解决步骤
2020/08/05 Javascript
原生微信小程序开发中 redux 的使用详解
2021/02/18 Javascript
本地文件上传到七牛云服务器示例(七牛云存储)
2014/01/11 Python
用Python输出一个杨辉三角的例子
2014/06/13 Python
python使用nntp读取新闻组内容的方法
2015/05/08 Python
python清除字符串里非字母字符的方法
2015/07/02 Python
python解决js文件utf-8编码乱码问题(推荐)
2018/05/02 Python
记录Python脚本的运行日志的方法
2019/06/05 Python
Django实现基于类的分页功能
2019/10/31 Python
使用Python测试Ping主机IP和某端口是否开放的实例
2019/12/17 Python
基于python的opencv图像处理实现对斑马线的检测示例
2020/11/29 Python
英国潮流网站:END.(全球免邮)
2017/01/16 全球购物
HomeAway英国:全球领先的度假租赁在线市场
2020/02/03 全球购物
介绍一下Linux文件的记录形式
2013/09/29 面试题
秘书专业自荐信范文
2013/12/26 职场文书
吨的认识教学反思
2014/04/27 职场文书
iPhone13再次曝光
2021/04/15 数码科技