| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Python知识库 -> 高版本Python3代码如何让低版本Python3解释器也能够执行 -> 正文阅读 |
|
[Python知识库]高版本Python3代码如何让低版本Python3解释器也能够执行 |
为了增加代码的可迁移性,公司要求我们的代码应该在Python3.6及之后的所有版本上都可以直接跑。而我们知道,Python3.6及之后的各个版本差别还是有的,而且有的是致命的,直接导致代码报错。 例如Python3.8及之后fstring的{x=}在低版本就不能用,会报语法错误。如果是异常倒还好处理,try-except然后except里写个低版本的代码就可以了,但是语法错误会导致解释器拒绝执行,因此写在try里都没有用:
使用Python3.6执行结果: 后来我想到可以把语法错误的代码以字符串的形式保存,然后执行时再用eval转成Python语句,就成功了:
Python3.6跑的结果是: a=123 Python3.8跑的结果是: a=‘123’ 可见try-except生效了,我们可以用Python3.6单独跑一下try里面的代码: 注意,try里不能写成print(f"{eval(‘{a=}’)}“),因为转换后成了print(f”{{a=}}"),嵌套了两层{},即使用Python3.8跑也会抛出异常。 如果觉得try-except不够优雅,可以执行时判断Python版本决定执行不同版本的代码,两种方法是等效的:
虽然是>(3,8),但是包括3.8的,因为sys.version_info是一个有5位的元组,3.8的各个版本的前两位是3和8,第3位是细分位,例如3.8.3版本就是(3,8,3,…)。我们知道即使是(3,8,0,…)和(3,8)比较时也是更大的,所以3.8的所有细分版本都是会通过的。 同样的,可以用eval方法解决海象(warlus)运算符(只有3.8及以上支持)的兼容问题:
Python3.6及以上版本运行结果均为: 1 1 要注意的是,eval部分不能写成(eval(‘ret:=test_fun(1)’))。因为eval外层的括号会被忽略,而海象运算符的优先级是最低的,会导致执行整个表达式时运算顺序混乱,执行时会报错。 当然,虽然这种方法可以兼容不同的Python版本,但是会导致代码变得复杂,因此除非很有必要用只有高版本支持的写法,否则统一用低版本的写法是最简洁的。 |
|
|
上一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/15 14:38:45- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |