Python2和Python3的兼容写法

论坛 期权论坛 期权     
真格量化   2019-7-4 09:59   3073   0
由于版本间的差异,Python开发者经常需要解决不同版本的兼容问题,我们来看看有哪些方法:

一,使用ImportError


Python3中将一些Python2的模块名称做了修改,需要我们做一些处理来保证代码在不同Python版本中能够正常运行。


# -*- coding: utf-8 -*-

try:
    # Python3
    from configparser import ConfigParser
except ImportError:
    # Python2
    from ConfigParser import ConfigParser

config = ConfigParser()

# do something


urllib库也是不兼容Python2和Python3的


# -*- coding: utf-8 -*-

try:
    # Python2
    from urllib import urlencode  
    from urllib import quote
    from urlparse import urlparse
    import urllib2 as request
except ImportError:
    # Python3
    from urllib.parse import urlencode  
    from urllib.parse import quote
    from urllib.parse import urlparse
    import urllib.request as request

# do something


二,根据版本来判断
根据sys.version_info.major来判断Python的版本,根据不同的版本导入不同的库。


# -*- coding: utf-8 -*-
import sys

if sys.version_info.major == 2:
    # Python2
    from urllib import urlencode
    from urllib import quote
    from urlparse import urlparse
    import urllib2 as request
else:
    # Python3
    from urllib.parse import urlencode  
    from urllib.parse import quote
    from urllib.parse import urlparse
    import urllib.request as request
# do something




三、使用脚本将py2代码转为py3


使用命令2to3 -w file.py可以直接在原地修改文件。其他命令可以使用2to3 --help查看;2to3 file.py可以看到转变前后的内容对比

2to3是Python自带的一个代码转换工具,可以将python2的代码自动转换为python3的代码。当然,不幸的是转换出的代码并没有对Python2的兼容做任何的处理。所以我们并不真正使用2to3转换出的代码。不过我们可以执行 2to3 file.py 查看输出信息,并修正相关问题。


四、使用python -3执行Python程序


2to3 可以检查出很多Python2&3的兼容性问题,但也有很多问题是2to3发现不了的。在加上 -3 参数后,程序在运行时会在控制台上将Python2和Python3不一致,同时2to3无法处理的问题提示出来。比如Python3和Python2中对除法的处理规则做过改变。使用-3参数执行4/2将提示 DeprecationWarning: classic int division 。
python -3 file.py


五、使用__future__导入


使用Python3的print函数,禁用Python2的print语句:from __future__ import print_function
像Python3一样,int除以int得float,而不像Python2那样是整除:from __future__ import division


像Python3一样,字符串字面量的类型为文本(Python2中的unicode,Python3中的str),而不是字节(Python2中的str,Python3中的bytes)
from __future__ import unicode_literal



Python2和Python3的print也有不同。print在Python2中是个关键字,而在Python3中是个函数。


在Python2中:

在Python3中:

还有:

六、注意列表推导式的变量作用域


在Python2中,列表推导式中的索引变量的是可以泄露到其封闭作用域中的。而Python3中则不可以。

下面举一个简单的例子说明这个问题,如我们在一个for循环内部使用列表推导式:


for i in range(2):
    a = [i for i in range(5)]
    print(i)


在Python3中,上面的代码输出为

>>0
>>1

而在Python2中,上面的代码输出为

>>4
>>4


内容参考:


http://python.jobbole.com/83987/
https://blog.csdn.net/u012151283/article/details/58049151
https://www.cnblogs.com/shengulong/p/10176903.html

— — — — — — E N D — — — — — —
往期文章:
Numpy处理tick级别数据技巧
真正赚钱的期权策略曲线是这样的
多品种历史波动率计算
如何实现全市场自动盯盘
AI是怎样看懂研报的
真格量化策略debug秘籍
真格量化对接实盘交易
常见高频交易策略简介

如何用撤单函数改进套利成交

Deque提高处理队列效率

策略编程选Python还是C++

如何用Python继承机制节约代码量

十大机器学习算法
如何调用策略附件数据

如何使用智能单

如何扫描全市场跨月价差

如何筛选策略最适合的品种

活用订单类型规避频繁撤单风险

真格量化回测撮合机制简介

如何调用外部数据

如何处理回测与实盘差别

如何利用趋势必然终结获利

常见量化策略介绍

期权交易“七宗罪”

波动率交易介绍

推高波动率的因素

波动率的预测之道

趋势交易面临挑战
如何构建知识图谱
机器学习就是现代统计学

AI技术在金融行业的应用

如何避免模型过拟合

低延迟交易介绍

架构设计中的编程范式

交易所视角下的套利指令撮合

距离概念与特征识别

气象风险与天气衍生品

设计量化策略的七个“大坑”

云计算在金融行业的应用

机器学习模型评估方法
真格量化制作期权HV-IV价差
另类数据介绍

TensorFlow中的Tensor是什么?

机器学习的经验之谈

用yfinance调用雅虎财经数据

容器技术如何改进交易系统
Python调用C++
如何选择数据库代理
统计套利揭秘
[h1]一个Call搅动市场?让我们温习一下波动率策略[/h1][h1]如何用真格量化设计持仓排名跟踪策略[/h1][h1]还不理解真格量化API设计?我们不妨参考一下CTP平台[/h1][h1]理解同步、异步、阻塞与非阻塞[/h1][h1]隐波相关系数和偏度——高维风险的守望者[/h1]Delta中性还不够?——看看如何设计Gamma中性期权策略
[h1]Python的多线程和多进程——从一个爬虫任务谈起[/h1]线程与进程的区别皮尔逊相关系数与历史K线匹配

K


真格量化可访问:
https://quant.pobo.net.cn


真格量化微信公众号,长按关注:

遇到了技术问题?欢迎加入真格量化Python技术交流QQ群  726895887
























分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:870
帖子:180
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP