一日一技:print大法为什么会浪费你的时间?

简介: 一日一技:print大法为什么会浪费你的时间?

我是极度反对使用Python 2的,但是可能有一些项目由于历史原因不得不使用Python 2,那么你可能会遇到一些非常诡异的问题。

这里给你看一个例子:

下面这一段函数,是从基于Python 2的一个Django项目中摘录出来的例子,让你看看Python 2 + print大法,会如何浪费你的时间。

def check_include(data):
     pattern = '你好.*?世界'
     print '========', data, '========='
     if re.search(pattern, data):
         print '包含'
         return
     print '不包含'

这一段代码用于检查参数 data中是否有『你好』和『世界』两个词语。

首先运行一下代码,可以看到如下的输出:

  1. ========别对我说你好,因为我不是世界=========
  2. 不包含

难道说pattern有问题?这一次改一下代码,把pattern也打印出来:

def check_include(data):
     pattern = '你好.*?世界'
     print '========', pattern, '========', data, '========='
     if re.search(pattern, data):
         print '包含'
         return
     print '不包含'

这一次的输出为:

  1. ========你好.*?世界========别对我说你好,因为我不是世界=========
  2. 不包含

难道正则表达式写错了?于是在Python里面测试正则表达式,发现是可以正确识别的:

>>> import re
>>> data = '别对我说你好,因为我不是世界'
>>> pattern = '你好.*?世界'
>>> re.search(pattern, data)
<_sre.SRE_Match object at 0x109590ac0>

那么为什么代码放在一个项目里面就不能识别呢?

如果你继续使用print大法,你会花很长时间才能定位到问题。但如果你使用PyCharm的调试模式,那么你1秒钟就能找到问题。

我们来看看如果用调试模式,你会看到什么好东西:

注意红框框住的两个变量,data的数据类型是 unicode而pattern的数据类型是 str,由于数据类型不一样,所以导致了正则表达式无法识别。但是,如果你用print直接打印这两个变量,你是无法知道他们的数据类型不一样的!

要解决这个问题也非常简单,只需要修改定义 pattern的这一行:

pattern = u'你好.*?世界'

一切就正常了。如下图所示。

这个问题告诉你如下三点:

  1. 别用Python 2!
  2. 如果必需用Python 2,请把所有字符串全部设置为 unicode类型!
  3. 不要使用print大法。善用调试功能!


目录
相关文章
|
网络协议 Linux 数据库
|
设计模式 数据可视化 测试技术
实践中的面向对象的例子
【7月更文挑战第1天】本文介绍面向对象编程注重代码的可理解性、重用和维护。例如,设计一个显示时间、温度等的设备,用户无需关心内部工作,这就是封装;如果需要多个设备,可通过多态创建不同实例;而继承则允许共享通用功能,如所有时钟都继承自计时器基类。
391 0
实践中的面向对象的例子
|
11月前
|
存储 网络协议 Linux
聊一聊 Python 的 socket,以及 select、poll、epoll 又是怎么一回事?
聊一聊 Python 的 socket,以及 select、poll、epoll 又是怎么一回事?
650 2
|
11月前
|
存储 NoSQL MongoDB
MongoDB 8.0现已全面可用
如何从MongoDB旧版本升级至8.0,可登录参考升级指南:https://www.mongodb.com/zh-cn/docs/manual/tutorial/upgrade-revision/
|
小程序 JavaScript 关系型数据库
戏曲文化苑|戏曲文化苑小程序|基于微信小程序的戏曲文化苑系统设计与实现(源码+数据库+文档)
戏曲文化苑|戏曲文化苑小程序|基于微信小程序的戏曲文化苑系统设计与实现(源码+数据库+文档)
192 1
|
Linux Shell 开发工具
C++ 的 ini 配置文件读写/注释库 inicpp 用法 [ header-file-only ]
这是一个C++库,名为inicpp,用于读写带有注释的INI配置文件,仅包含一个hpp头文件,无需编译,支持C++11及以上版本。该库提供简单的接口,使得操作INI文件变得容易。用户可通过`git clone`从GitHub或Gitee获取库,并通过包含`inicpp.hpp`来使用`inicpp::iniReader`类。示例代码展示了读取、写入配置项以及添加注释的功能,还提供了转换为字符串、双精度和整型的函数。项目遵循MIT许可证,示例代码可在Linux环境下编译运行。
1315 0
|
Ubuntu Linux 数据安全/隐私保护
Linux Ubuntu crontab 添加错误 提示:no crontab for root - using an empty one 888
错误提示: no crontab for root - using an empty one 888
1092 1
Linux Ubuntu crontab 添加错误 提示:no crontab for root - using an empty one 888
|
网络协议 安全 Ubuntu
c10k百万并发思考
c10k百万并发思考
156 1
|
缓存 JSON 运维
深入探讨API调用性能优化与错误处理
随着互联网技术的不断发展,API(应用程序接口)已经成为软件系统中重要的组成部分。而优化API调用的性能以及处理错误和异常情况则是保障系统稳定性和可靠性的关键。本文将从以下几个方面来探讨如何进行性能优化和错误处理。
|
存储 缓存 监控
深入浅出 eBPF 技术
1 eBPF 介绍eBPF 是革命性技术, 起源于 linux 内核, 能够在操作系统内核中执行沙盒程序。旨在不改变内核源码或加载内核模块的前提下安全便捷的扩展内核能力。1.1 demo 展示demo程序如下:#include &lt;linux/bpf.h&gt; #define SEC(NAME) __attribute__((section(NAME), used)) SEC(&quot
4434 0
深入浅出 eBPF 技术