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中MySQLdb的事务处理功能
Sep 21 Python
使用pyecharts在jupyter notebook上绘图
Apr 23 Python
Python反射用法实例简析
Dec 22 Python
python版大富翁源代码分享
Nov 19 Python
python腾讯语音合成实现过程解析
Aug 01 Python
python实现银行实战系统
Feb 26 Python
python 使用递归实现打印一个数字的每一位示例
Feb 27 Python
Python发送手机动态验证码代码实例
Feb 28 Python
Python中的整除和取模实例
Jun 03 Python
Keras—embedding嵌入层的用法详解
Jun 10 Python
python中tkinter窗口位置\坐标\大小等实现示例
Jul 09 Python
pytorch常用数据类型所占字节数对照表一览
May 17 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
8个必备的PHP功能实例代码
2013/10/27 PHP
php CI框架插入一条或多条sql记录示例
2014/07/29 PHP
php实现给图片加灰色半透明效果的方法
2014/10/20 PHP
PHP设计模式之适配器模式原理与用法分析
2018/04/25 PHP
PHP ElasticSearch做搜索实例讲解
2020/02/05 PHP
使用jQuery向asp.net Mvc传递复杂json数据-ModelBinder篇
2010/05/07 Javascript
鼠标滚轮控制网页横向移动实现思路
2013/03/22 Javascript
AngularJS中的模块详解
2015/01/29 Javascript
很全面的JavaScript常用功能汇总集合
2016/01/22 Javascript
knockoutjs模板实现树形结构列表
2017/07/31 Javascript
详解如何使用 vue-cli 开发多页应用
2017/12/16 Javascript
JS+HTML5 canvas绘制验证码示例
2018/12/05 Javascript
了解在JavaScript中将值转换为字符串的5种方法
2019/06/06 Javascript
JS实现在线ps功能详解
2019/07/31 Javascript
原生js无缝轮播插件使用详解
2020/03/09 Javascript
Vue实现简单的拖拽效果
2020/08/25 Javascript
Python定时执行之Timer用法示例
2015/05/27 Python
利用python3随机生成中文字符的实现方法
2017/11/24 Python
Python中交换两个元素的实现方法
2018/06/29 Python
判断python字典中key是否存在的两种方法
2018/08/10 Python
python集合比较(交集,并集,差集)方法详解
2018/09/13 Python
CentOS下Python3的安装及创建虚拟环境的方法
2018/11/28 Python
Python 实现王者荣耀中的敏感词过滤示例
2019/01/21 Python
python3实现猜数字游戏
2020/12/07 Python
Selenium基于PIL实现拼接滚动截图
2020/04/10 Python
python编写softmax函数、交叉熵函数实例
2020/06/11 Python
java字符串格式化输出实例讲解
2021/01/06 Python
英国护肤品购物网站:Beauty Expert
2016/08/19 全球购物
基层干部十八大感言
2014/01/19 职场文书
社区维稳工作方案
2014/06/06 职场文书
个人批评与自我批评总结
2014/10/17 职场文书
工作检讨书范文
2015/01/23 职场文书
宾馆前台接待岗位职责
2015/04/02 职场文书
经典祝酒词大全
2015/08/12 职场文书
公安忠诚教育心得体会
2016/01/23 职场文书
简单且有用的Python数据分析和机器学习代码
2021/07/02 Python