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中自定义函数的教程
Apr 27 Python
Python排序搜索基本算法之冒泡排序实例分析
Dec 09 Python
Python 25行代码实现的RSA算法详解
Apr 10 Python
Python3.6通过自带的urllib通过get或post方法请求url的实例
May 10 Python
python事件驱动event实现详解
Nov 21 Python
python粘包问题及socket套接字编程详解
Jun 29 Python
python通过实例讲解反射机制
Oct 17 Python
python进程的状态、创建及使用方法详解
Dec 06 Python
如何更改 pandas dataframe 中两列的位置
Dec 27 Python
python判断变量是否为列表的方法
Sep 17 Python
python 标准库原理与用法详解之os.path篇
Oct 24 Python
python使用shell脚本创建kafka连接器
Apr 29 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 中的面向对象编程:通向大型 PHP 工程的办法
2006/12/03 PHP
PHP 日常开发小技巧
2009/09/23 PHP
举例讲解PHP面对对象编程的多态
2015/08/12 PHP
学习php设计模式 php实现状态模式
2015/12/07 PHP
Yii使用技巧大汇总
2015/12/29 PHP
Yii框架模拟组件调用注入示例
2019/11/11 PHP
基于Web标准的UI组件 — 树状菜单(2)
2006/09/18 Javascript
JS实现下拉框的动态添加(附效果)
2013/04/03 Javascript
JS获取html对象的几种方式介绍
2013/12/05 Javascript
javascript 按键事件(兼容各浏览器)
2013/12/20 Javascript
js检验密码强度(低中高)附图
2014/06/05 Javascript
浅谈javascript面向对象程序设计
2015/01/21 Javascript
深入理解JavaScript的React框架的原理
2015/07/02 Javascript
纯CSS3代码实现滑动开关效果
2015/08/19 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(二)
2017/01/21 Javascript
如何使用vuejs实现更好的Form validation?
2017/04/07 Javascript
Bootstrap导航菜单点击后无法自动添加active的处理方法
2018/08/10 Javascript
小程序数据通信方法大全(推荐)
2019/04/15 Javascript
详解Vue项目中实现锚点定位
2019/04/24 Javascript
微信小程序开发之点击按钮退出小程序的实现方法
2019/04/26 Javascript
微信小程序如何播放腾讯视频的实现
2019/09/20 Javascript
react使用CSS实现react动画功能示例
2020/05/18 Javascript
Python基于回溯法解决01背包问题实例
2017/12/06 Python
Python学生信息管理系统修改版
2018/03/13 Python
Python基于FTP模块实现ftp文件上传操作示例
2018/04/23 Python
python opencv进行图像拼接
2020/03/27 Python
上海天奕面试题笔试题
2015/04/19 面试题
土木工程实习生自我鉴定
2013/09/19 职场文书
会计电算化专业毕业生推荐信
2013/12/24 职场文书
2014年应届大学生自我评价
2014/01/09 职场文书
宠物店的创业计划书范文
2014/01/11 职场文书
公司拓展活动方案
2014/02/13 职场文书
社区健康教育实施方案
2014/03/18 职场文书
朋友离别感言
2015/08/04 职场文书
2016母亲节感恩话语
2015/12/09 职场文书
Spring JPA 增加字段执行异常问题及解决
2022/06/10 Java/Android