首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >一日一技:print大法为什么会浪费你的时间?

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

作者头像
青南
发布2019-03-11 15:31:54
发布2019-03-11 15:31:54
1.4K0
举报
文章被收录于专栏:未闻Code未闻Code

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

这里给你看一个例子:

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

代码语言:javascript
复制
  def check_include(data):   
    pattern = '你好.*?世界'     
    print '========', data, '========='     
    if re.search(pattern, data):       
      print '包含'         
      return     
     print '不包含'

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

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

代码语言:javascript
复制
======== 别对我说你好,因为我不是世界 =========不包含

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

代码语言:javascript
复制
def check_include(data):   
  pattern = '你好.*?世界'    
   print '========', pattern, '========', data, '========='     
   if re.search(pattern, data):       
     print '包含'         
     return     
   print '不包含'

这一次的输出为:

代码语言:javascript
复制
======== 你好.*?世界 ======== 别对我说你好,因为我不是世界 =========不包含

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

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

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

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

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

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

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

代码语言:javascript
复制
pattern = u'你好.*?世界'

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

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

  1. 别用Python 2!
  2. 如果必需用Python 2,请把所有字符串全部设置为 unicode类型!
  3. 不要使用print大法。善用调试功能!
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-02-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 未闻Code 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档