ale*_*inn 10 python compatibility python-2.7 python-3.x
我试图使我的一些代码Python 2和3兼容.
目前,我与像功能挣扎range
/ xrange
等方法dict.items
/ dict.iteritems
.理想情况下,我希望我的代码能够在Python 3.x中使用前者,在Python 2.x中使用后者.
使用if
/ else
在我看来是实现这个的最简单的方法:
if py >= 3:
for item in array.items()
...
else:
for item in array.iteritems()
Run Code Online (Sandbox Code Playgroud)
但是,这样做会导致大量重复和丑陋的代码.有没有更好的方法只使用标准库?我可以在代码开头的某个地方说明总是使用range
/ dict.items
if py >= 3
和xrange
/ dict.iteritems
如果没有?
可以这样做吗?
if py < 3:
use xrange as range
Run Code Online (Sandbox Code Playgroud)
我环顾四周,我知道有几个库,比如六个未来化的库,用于解决这个问题.但是我正在使用只运行python 2.7的服务器,我不允许在其上安装任何额外的库.我有一些我想使用的python3代码,但我也想只维护一个版本的代码.
Rol*_*ith 10
import sys
if sys.version_info.major > 2:
xrange = range
Run Code Online (Sandbox Code Playgroud)
但正如Wim所暗示的那样,这基本上是自己重写六个.
正如你所看到的,six
处理的更多range
.只需查看_moved_attributes
六个源代码中的列表即可.
虽然Python附带"包含电池",但它的标准库不是也不能包罗万象.它也没有缺陷.
有时会有更好的电池,不使用它们是浪费.只是比较urllib2
有requests
.后者更适合使用.
Neu*_*onQ 10
简单的,"不要让我思考!" 我使用的解决方案是启动简单脚本:
#!/usr/bin/env python
# just make sure that Python 3 code runs fine with 2.7+ too ~98% of the time :)
from __future__ import (division, print_function, absolute_import,
unicode_literals)
from builtins import int
try:
from future_builtins import ascii, filter, hex, map, oct, zip
except:
pass
import sys
if sys.version_info.major > 2:
xrange = range
Run Code Online (Sandbox Code Playgroud)
(额外的提示,以阻止大多数pep8短裤为此不必要地对你大喊:移动最后3行内部和上面的try
块顶部)
但我使用它的唯一情况基本上是"太大而且毛茸茸的shell脚本,所以我很快将它们重写为Python,我只希望它们在Python 2和3下运行,具有0依赖性".请不要在实际应用程序/库代码中使用它,除非您确切知道上述所有行的后果,以及它们是否足以满足您的使用案例.
此外,在这种情况下的"解决方案" .iteritems
是"只是不使用它",忽略内存使用优化,而只是总是使用.items
- 如果这很重要,这意味着你不再编写"0依赖简单脚本"了,所以只需选择Python 3和代码(如果你需要假装我们在2008年,则选择Python 2).
另外,请检查这些资源以获得正确的理解:
(注意:我正在回答这个已经回答的问题,主要是因为接受的答案粗略地翻译为"你是愚蠢的,这是愚蠢的",我发现这个问题非常粗鲁:不管问题多么愚蠢,以及如何"错误"要真正回答它,一个问题值得一个真正的答案._