python软件怎么使用(python做界面)

您所在的位置:网站首页 python怎么做软件界面 python软件怎么使用(python做界面)

python软件怎么使用(python做界面)

#python软件怎么使用(python做界面)| 来源: 网络整理| 查看: 265

Python2已经到了生命的尽头,所以是时候把你的python2项目转换成python3了。

Python的2.x系列在2020年1月正式结束,2020年4月以后就不支持了,但是把代码转换成Python 3比你想象的要容易。上周末花了一晚上把3D渲染器的前端代码(及其对应的用于Qt/PySide版本的Python)转换成Python 3,回想起来很简单,虽然在重构的过程中看起来相对无望。转化过程看起来有点像迷宫。你做的每一个改变都揭示了你需要做的更多改变。

你可能想转换,也可能不想转换,但有时候你就是别无选择,不管是因为你延迟太久,还是因为你依赖一个除非你转换,否则无法维护的模块。如果你正在寻找一个简单的任务来开始你对开源的贡献,那么将Python2应用程序转换成Python3是一个给你留下简单但有意义的印象的好方法。

不管你为什么要将Python 2代码重构为Python 3,这都是一项重要的工作。这是三个步骤,可以清晰地完成任务。

1.运行2to3

在过去的几年里,Python推出了一个名为2to3的脚本,它为您完成了从python2到python3的大部分转换。而且你已经安装好了(不管你有没有意识到)。

这是用Python 2.6编写的一小段代码:

#!/usr/sweet耳机/env python

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

mystring=u'abcd'

打印(mystring [-1])运行2to3脚本:

$ 2to3示例. py

重构解决方案:重构示例

-示例. py(原件)

示例. py(重构)

@@ -1,5 1,5 @@

#!/usr/sweet耳机/env python

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

-mystring=u'abcd'

-打印订单(mystring[-1])

mystring='abcd'

打印(订单(mystring[-1])

重构工具:需要修改的文件:

反射工具:example.py默认情况下,2to3仅打印使旧Python代码符合Python 3标准所需的更改。输出是一个可用的补丁,您可以使用它来更改文件,但是使用- write(或-w)选项可以让Python更容易地为您执行此操作:

$ 2to3 -w示例. py

[.]

重构工具:已修改的文件:

修改工具:example.py2to3脚本不能仅在单个文件上运行。不管有没有- write选项,您都可以在Python文件的整个目录中运行它来处理所有*。这个目录和zxdyl目录中的py文件。

2.使用Pylint或Pyflakes

在Python 2中发现没有问题但在Python 3中不能正常工作的怪异代码并不少见。因为这些奇怪的现象不能通过转换语法来修复,所以它们会以同样的方式跳过2to3,但是一旦你尝试运行代码,它们就会失败。

要检测此类问题,您可以使用Pylint之类的应用程序或Pyflakes(或flake8包装程序)之类的工具。我更喜欢Pyflakes,因为与Pylint不同,它忽略了代码风格的偏差。虽然Python的“精致”通常是它的优势之一,但是在将别人的代码从2移植到3时,将风格和功能作为两个独立的bug来对待是一个优先问题。

以下是Pyflakes的输出示例:

$ pyflakes示例/数学

示例/数学/enum.py:19:未定义的名称“cmp”

示例/数学/enum.py:105:局部变量“e”已赋值,但从未使用

示例/数学/enum.py:109:未定义的名称“basestring”

示例/数学/enum.py:208:未定义的名称“EnumValueCompareError”

example/mathematics/enum . py :2083360局部变量' e '被赋给但从未使用此输出(与Pylint的143行相比,大部分是关于缩进的警告)清楚地显示了代码中应该修复的问题。

这里最有趣的错误是第19行的第一个错误。这有点误导,因为你可能认为cmp是一个从未定义过的变量,但cmp实际上是Python 2中的一个函数,在Python 3中并不存在。

。 它包装在try语句中,因此在很明显没有产生try结果之前,这个问题很容易被忽略。 try: result = cmp(self.index, other.index) except: result = 42 return result

在将应用程序维护为Python 2代码库与您决定移植该应用程序之间,有无数个不再存在或已更改的函数示例。PySide(2)绑定已更改,Python函数已消失或已转换(例如,对importlib的imp),等等。遇到它们时,一一修复。即使您需要重新实现或替换那些缺少的功能,但到目前为止,大多数这些问题是已知的并有据可查。真正的挑战更多的是捕获错误而不是修复错误,因此,请使用Pyflakes或类似工具。

3.修复损坏的Python 2代码

2to3脚本使您的代码与Python 3兼容,但只知道Python 2和3之间的区别。它通常无法进行调整以说明库中的更改,这些更改早在2010年就可以使用,但此后进行了重大修订。您必须手动更新该代码。

例如,这段代码显然可以追溯到Python 2.6的时代:

class CLOCK_SPEED: TICKS_PER_SECOND = 16 TICK_RATES = [int(i * TICKS_PER_SECOND) for i in (0.5, 1, 2, 3, 4, 6, 8, 11, 20)] class FPS: STATS_UPDATE_FREQUENCY = CLOCK_SPEED.TICKS_PER_SECOND

像2to3和Pyflakes这样的自动化工具并没有检测到这个问题,但是Python 3没有把GAME_SPEED.TICKS_PER_SECOND看作一个有效的语句,因为被调用的函数从未被显式声明过。调整代码是面向对象编程中的一个简单练习:

class CLOCK_SPEED: def TICKS_PER_SECOND(): TICKS_PER_SECOND = 16 TICK_RATES = [int(i * TICKS_PER_SECOND) for i in (0.5, 1, 2, 3, 4, 6, 8, 11, 20)] return TICKS_PER_SECOND class FPS: STATS_UPDATE_FREQUENCY = CLOCK_SPEED.TICKS_PER_SECOND()

您可能倾向于通过用构造函数(一个设置默认值的初始化函数)替换TICKS_PER_SECOND函数来使其更简洁,但这会将所需的调用从CLOCK_SPEED.TICKS_PER_SECOND()更改为CLOCK_SPEED(),这可能会或可能不会对代码中的其他部分产生影响。如果您对代码很了解,那么您可以更好地判断需要进行多少修改,但是一般来说,我更愿意假设我所做的每一个更改都不可避免地要求对项目中的每一个其他文件进行多次更改,因此我尝试在现有结构中工作。

一旦您完成了legwork,您将拥有一个Python 3模块或应用程序,并且常规维护(以及那些使Pylint感到高兴的样式更改)可以重新开始!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3