python3 读取txt替换、n_从Python2迁移到Python3实战(一) pyupgrade

本文介绍了在实际工作中将项目从Python2.7迁移到Python 3.7时,如何使用pyupgrade工具自动修改代码中的旧语法。pyupgrade能替换旧的字符串格式化、Unicode表示、无效转义序列等,并移除对Python2的兼容代码,如six模块。文章通过实例展示了pyupgrade在集合、字典解析、字符串格式化等方面的功能。
摘要由CSDN通过智能技术生成

fbbcded888d6b8bc70653f02945a1a0d.gif

前言

从这篇开始我会不定期写一些在实际工作中把项目代码从Python2.7迁移到最新的Python 3.7的经验。

这篇先介绍pyupgrade - 一个修改代码中Python 2语法到最新版本写法的工具,同时它还可以作为pre-commit钩子,可以在代码提交或者push时拒绝引入旧的用法。

为什么需要这么一个工具呢?3个理由:

  1. 替换代码中旧版本Python的用法。例如 '%s %s'%(a,b)这种百分号的字符串格式化写法

  2. 替换成Python 3的新语法。例如在Python 3中 super不再需要传递self、字符串格式化在Python 3.6及以后可以直接用f-strings

  3. 迁移后不再需要支持Python2,所以应该去掉six模块的相关使用,直接用Python3的代码写才是正途。

我日常维护的项目中Python代码都在几千到上百万行级别,可以设想一下,如果人工来做代码替换将是一个极为浩大的工程。

在现有的Python世界,过去只有lib2to3模块和其衍生品(之后我会专门讲),但是效果有限,pyupgrade是一个很好的补充,我们来了解一下它都实现了那些功能

集合

set(()) # set()

set([]) # set()

set((1,)) # {1}

set((1, 2)) # {1, 2}

set([1, 2]) # {1, 2}

set(x for x in y) # {x for x in y}

set([x for x in y]) # {x for x in y}

左面是替换前的代码,后面井号后的注释部分是替换后的效果。set相关的部分算是统一用法,并不是左面的写法在Python3已经不可用。

字典解析

dict((a, b) for a, b in y) # {a: b for a, b in y}

dict([(a, b) for a, b in y]) # {a: b for a, b in y}

同上,属于统一用法

Python2.7+ Format说明符

'{0} {1}'.format(1, 2) # '{} {}'.format(1, 2)

'{0}' '{1}'.format(1, 2) # '{}' '{}'.format(1, 2)

从Python2.7开始,不再强制指定索引

使用str.format替代printf风格的字符串format写法

'%s %s' % (a, b) # '{} {}'.format(a, b)

'%r %2f' % (a, b) # '{!r} {:2f}'.format(a, b)

'%(a)s %(b)s' % { 'a': 1, 'b': 2} # '{a} {b}'.format(a=1, b=2)

后面的是Python2.7推荐的写法。但是可以传入 --keep-percent-format忽略这类修改。

Unicode literals

u'foo' # 'foo'

u"foo" # 'foo'

u'''foo'

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值