我们推出了《系统管理员的 Python 脚本》
课程 ,其中涉及 Python 2 和 Python 3。这次发布是讨论为什么这个版本的差异如此大以及你应该注意什么的好时机。
关于版本控制的简要说明
如果您使用SemVer对软件项目进行版本控制,那么主要版本更改就是进行“重大更改”的时候,而这正是 Python 3 所做的。从版本控制的角度来看,这正是我们对项目进行版本控制的方式。
犯了错误……
Python 3 之所以存在,是因为 Guido 看到了该语言需要改进的地方,而这些改进无法兼顾向后兼容性。作为一名软件从业者,你会边学边做,刚开始的时候几乎不可能知道所有的事情。项目设计出现一些变化,后来发现这些变化并不理想,这很正常。Python 3 是偿还“技术债务”的一个很好的例子,但这一决定最初并没有得到很好的接受。在 Python 3 发布时,有大量的 Python 代码在生产中,既有开源的,也有专有的。你可以想象,当你需要更改大量应用程序代码时,在你的企业中升级到新版本的语言是很困难的。这就是 Python 3 面临的问题,所以尽管 Python 3 很棒,但很难在一夜之间让如此庞大的社区动起来。
主要区别
以下是我认为最有可能影响您的 Python 代码的两个主要版本之间的差异:
字符串和二进制数据(字节)
在版本 2 中,您可以将 Unicode 数据(字节)与 8 位字符串混合,并且偶尔会起作用,但并非总是如此。这导致了 Python 3 中的变化;您不再能够隐式混合文本和二进制数据。最有可能让您绊倒的地方将是根据文件的模式与文件内容进行交互。以下示例可以演示相同的代码如何在 Python 2 和 3 之间生成不同的类型和错误。str_vs_bytes.py
f = open("example.txt", 'rb') # opening in 'binary' read modedata = f.read()other_str = "other string"print("data is of type: %s" % type(data))print("other_str is of type: %s" % type(other_str))data + other_str # concatenating to see if an error occurs
如果我们使用 Python 2 运行此脚本,我们将获得以下结果:
$ python2 str_vs_bytes.pydata is of type: <type 'str'>other_str is of type: <type 'str'>
使用 Python 3 执行同样的事情,我们将看到一个错误,并且其other_str
类型与以下不同data
:
$ python3 str_vs_bytes.pydata is of type: <class 'bytes'>other_str is of type: <class 'str'>Traceback (most recent call last): File "str_vs_bytes.py", line 9, in <module> data + other_strTypeError: can't concat str to bytes
这里最大的障碍是确保您始终使用 Python 3 中的正确模式打开文件。
print
语句与print
函数
编程中最常见的事情之一就是打印到屏幕上。Python 通过在 Python 2 中使用print
语句和在 Python 3 中使用print
函数,使打印尽可能简单。这种差异非常微妙,但在 Python 2 和 3 之间,使用print
发生了变化,因此它是一个函数,因此需要括号。这行在 Python 2 中运行良好,但在 Python 3 中会引发异常:Python 2
>>> print "something"something
Python 3
>>> print "something" File "<stdin>", line 1 print "something" ^SyntaxError: Missing parentheses in call to 'print'. Did you mean print("something")?
值得庆幸的是,错误很好地解释了情况,如果你在 Python 2print
使用中添加括号,就不会遇到任何问题。
整数除法
在 Python 2 中,两个整数相除总是返回一个整数。这是有道理的,因为您可能不想隐式地从 转换为int
,float
但作为一名程序员,当您想到除法时,您只想进行正常的数学运算。这种行为在 Python 3 中发生了变化,因此标准除法将返回完整结果而不是截断值。Python 2
>>> 1 / 2 == 1 // 2True>>> 1 / 20
以下是使用Python 3 的相同示例:
>>> 1 / 2 == 1 // 2False>>> 1 / 20.5
为 Python 2和3编写代码
在课程中,我们利用测试驱动开发 (TDD) 来帮助我们设计软件,但我们获得的额外好处之一是我们拥有一个可以针对多个 Python 版本运行的测试套件。这种方法让您更容易确信您正在编写支持两个主要版本的软件,但如果您不编写测试,那么了解主要差异就很重要。
请先 登录后发表评论 ~