《Python Cookbook(第2版)中文版》——1.3 测试一个对象是否是类字符串
本节书摘来自异步社区《Python Cookbook(第2版)中文版》一书中的第1章,第1.3节,作者[美]Alex Martelli , Anna Martelli Ravenscrof , David Ascher ,高铁军 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。
1.3 测试一个对象是否是类字符串任务
有时候需要测试一个对象,尤其是当你在写一个函数或者方法的时候,经常需要测试传入的参数是否是一个字符串(或者更准确地说,这个对象是否具有类似于字符串的行为模式)。
解决方案
下面给出一个利用内建的isinstance和basestring来简单快速地检查某个对象是否是字符串或者Unicode对象的方法,如下:
def isAString(anobj): return isinstance(anobj, basestring)
讨论
很多遇到这个问题的程序员第一反应是进行类型测试:
def isExactlyAString(anobj): return type(anobj) is type()
然而,这种方法非常糟糕,因为它破坏了Python强大力量的源泉—平滑的、基于签名的多态机制。很明显Unicode对象无法通过这个测试,用户自己编写的str的子类也不行,甚至任何一种行为表现类似于字符串的用户自定义类型的实例都无法通过测试。
本节推荐的内建函数isinstance则要好很多。内建类型basestring的存在使得这个方法成为可能。basestring是str和unicode类型的共同基类,任何类字符串的用户自定义类型都应该从基类basestring派生,这样能保证isinstance的测试按照预期工作。本质上basestring是一个“空”的类型,就像object,所以从它派生子类并没有什么开销。
不幸的是,这个似乎完美的isinstance检查方案,对于Python标准库中的UserString模块提供的UserString类的实例,完全无能为力。而UserString对象是非常明显的类字符串对象,只不过它不是从basestring派生的。如果想支持这种类型,可以直接检查一个对象的行为是否真的像字符串一样,比如:
def isStringLike(anobj): try: anobj + except: return False else: return True
这个isStringLike函数比方案中给出的isAString函数慢且复杂得多,但它的确适用于UserString(以及其他的类字符串的类型)的实例,也适用于str和unicode。
Python中通常的类型检查方法是所谓的鸭子判断法:如果它走路像鸭子,叫声也像鸭子,那么对于我们的应用而言,就可以认为它是鸭子了。IsStringLike函数只不过检查了叫声部分,那其实还不够。如果需要检查anobj对象的更多的类字符串特征,可以改造try子句,让它检查更多细节,比如:
try: anobj.lower( ) + anobj +
根据我的经验,isStringLike函数的测试通常就已经满足需要了。
进行类型验证(或者任何验证任务)的最具Python特色的方法是根据自己的预期去执行任务,在此过程中检测并处理由于不匹配产生的所有错误和异常。这是一个著名的处理方式,叫做“获得事后原谅总是比事先得到许可要容易得多(Its easier to ask forgiveness than permission)”,或简称EAFP。try/except是保证EAFP处理风格的关键工具。有时,像本节中的例子一样,可以选择一个简单的判断方法,比如拼接一个空字符串,作为对一系列属性的集合(字符串对象提供的各种操作和方法)的一个替代性判断。
Python函数是所谓的第一类对象(First-Class Object)是什么鬼? 之前写过一篇关于装饰器的文章,虽然写得还算不错,但是也有不少同学表示没看懂,我大概分析了其中的原因,主要问题是他们不理解函数,因为Python中的函数不同于其它语言。
【python可视化】python编码规范、标准库与扩展库对象的导入与使用 代码布局和排版在很大程度上决定了代码可读性的好坏,变量名、函数名、类名等标识符名称也会对代码的可读性带来一定的影响。一个好的python代码不仅应该是正确的,还应该是漂亮的、优雅的。
异步社区 异步社区(www.epubit.com)是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架,于2015年8月上线运营。公众号【异步图书】,每日赠送异步新书。
相关文章
- Python 操作 Kafka --- kafka-python
- python爬虫知识点总结(九)Requests+正则表达式爬取猫眼电影
- python实现基于RPC协议的接口自动化测试
- Python测试框架Pytest的基础入门
- python+requests接口自动化测试框架实例详解教程
- Python测试框架pytest入门基础
- python 保存图片_用Python从视频中提取每一帧的图片
- python是否存在某个字符串 效率最高_Python中判断子串存在的性能比较及分析总结...
- 地球引擎初级教程——Python API 语法(内涵JavaScript转python工具包介绍)
- Python怎么就火起来了?学会python可以做的兼职
- 64 python - 模块制作
- python模块 multiprocess 多进程
- Python自动化测试之Python简介及环境安装配置
- 【python】+704个常用工具Python库
- 【Python】+自动化测试框架的设计编写
- Python切割超大日志文件、保留文件最后几行
- python问答模块
- Python 教程大全之使用 python 获取唯一单词的计数
- 《从问题到程序:用Python学编程和计算》——练习
- 华为OD机试 - 简易压缩算法(Python) | 机试题+算法思路+考点+代码解析 【2023】
- Python 基础 之 Ubuntu 上安装 python 和 python-pip
- Python 基础 之 python 进程知识点整理,实现一个简单使用进程池的多进程文件夹文件copy器
- Docker+Selenium Grid+Python搭建分布式测试环境
- 学习笔记(44):Python实战编程-单击事件
- Python入门学习笔记第五章——if条件句~~~