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 相关文章推荐
wxPython事件驱动实例详解
Sep 28 Python
利用Python找出序列中出现最多的元素示例代码
Dec 08 Python
基于Python开发chrome插件的方法分析
Jul 07 Python
Python 实现数据结构中的的栈队列
May 16 Python
Opencv实现抠图背景图替换功能
May 21 Python
Python 词典(Dict) 加载与保存示例
Dec 06 Python
有关Tensorflow梯度下降常用的优化方法分享
Feb 04 Python
使用TensorFlow直接获取处理MNIST数据方式
Feb 10 Python
Python分析最近大火的网剧《隐秘的角落》
Jul 02 Python
idea2020手动安装python插件的实现方法
Jul 17 Python
Python内置数据结构列表与元组示例详解
Aug 04 Python
Python实现信息管理系统
Jun 05 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+javascript模拟Matrix画面
2006/10/09 PHP
php之curl设置超时实例
2014/11/03 PHP
php对关联数组循环遍历的实现方法
2015/03/13 PHP
通过修改配置真正解决php文件上传大小限制问题(nginx+php)
2015/09/23 PHP
php 解析xml 的四种方法详细介绍
2016/10/26 PHP
PHP正则表达式匹配替换与分割功能实例浅析
2017/02/04 PHP
php的PDO事务处理机制实例分析
2017/02/16 PHP
Javascript实现的分页函数
2007/02/07 Javascript
JS延迟加载加快页面打开速度示例代码
2013/12/30 Javascript
JS实现清除指定cookies的方法
2014/09/20 Javascript
浅析javascript的return语句
2015/12/15 Javascript
浅谈JS正则表达式的RegExp对象和括号的使用
2016/07/28 Javascript
react.js 获取真实的DOM节点实例(必看)
2017/04/17 Javascript
JS实现图片手风琴效果
2020/04/17 Javascript
详解vue 单页应用(spa)前端路由实现原理
2018/04/04 Javascript
vuex操作state对象的实例代码
2018/04/25 Javascript
Nuxt项目支持eslint+pritter+typescript的实现
2019/05/20 Javascript
vue 实现路由跳转时更改页面title
2019/11/05 Javascript
在weex中愉快的使用scss的方法步骤
2020/01/02 Javascript
JS运算符优先级与表达式示例详解
2020/09/04 Javascript
微信小程序实现简单购物车功能
2020/12/30 Javascript
python中from module import * 的一个坑
2014/07/20 Python
python 的topk算法实例
2020/04/02 Python
anaconda3安装及jupyter环境配置全教程
2020/08/24 Python
基于Python实现全自动下载抖音视频
2020/11/06 Python
Python3 + Appium + 安卓模拟器实现APP自动化测试并生成测试报告
2021/01/27 Python
中间件的定义
2016/08/09 面试题
运动会广播稿60字
2014/01/15 职场文书
教师远程培训感言
2014/03/06 职场文书
加多宝凉茶广告词
2014/03/18 职场文书
安全标语口号
2014/06/09 职场文书
科学发展观活动总结
2014/08/28 职场文书
校外活动方案
2014/08/28 职场文书
2014年个人总结范文
2015/03/09 职场文书
小学班主任教育随笔
2015/08/15 职场文书
PyQt5 QThread倒计时功能的实现代码
2021/04/02 Python