Python3.8 了解的差不多了吧,Python3.9 新特性了解一下!

640?wx_fmt=png"Python学习开发",一个值得加星标640?wx_fmt=png的公众号。

640?wx_fmt=png

正文共:4946 字 1 图

预计阅读时间:13 分钟

作者:陈祥安

原文有删改:https://docs.python.org/3.9/whatsnew/3.9.html

本文将解释 Python 3.9 中的新特性,而不是 3.8。有关完整的详细信息,请参见更改日志。

目前官网只有 3.8 的下载包,3.9 需要自己编译 Cpython,可以参考我之前的文章里面有编译部分的内容,

语言上的变化

1、使用 Python 进行相对导包的时候,__import__ 出现异常时类型由原来的 ValueError 变成了 ImportError。(由 Ngalim Siregar 在 bpo-37444 中贡献)

"""Resolve a relative module name to an absolute one."""bits = package.rsplit('.', level - 1)if len(bits) < level:
-          raise ValueError('attempted relative import beyond top-level package')
+            raise ImportError('attempted relative import beyond top-level package')base = bits[0]return '{}.{}'.format(base, name) if name else base

-:github 中的删除

补充知识:__import__() 函数一般用于动态加载类和函数。

r = __import__('requests_html', globals(), locals(), ['HTMLSession'], 0) 
session = r.HTMLSession()
print(session.get("http://www.baidu.com"))
#globals() 函数会以字典类型返回当前位置的全部全局变量。
#locals() 函数会以字典类型返回当前位置的全部局部变量。

ImportError 触发异常原因:在涉及到相对导入时,package 所对应的文件夹必须正确的被 python 解释器视作 package ,而不是普通文件夹。否则由于不被视作 package,无法利用 package 之间的嵌套关系实现 Python 中包的相对导入。

2、Python 现在获取在命令行上指定的脚本文件名的绝对路径(例如:python script.py:__main__ 模块的 __file__ 属性,sys.argv[0] 和 sys.path[0] 显示的也是绝对路径,而不是相对路径 (这地方之前提出了一个 bug),通过 os.chdir()更改当前目录后,这些路径仍然有效。但是现在出现异常 traceback 信息的时候还会显示

通过命令行执行文件的时候

import sys
print(f"{__file__=}")
print(f"{sys.argv=}")
print(f"{sys.path[0]=}")

运行

$ ./python3 script.py 

结果

__file__='/Users/chenxiangan/cpython/script.py'
sys.argv=['/Users/chenxiangan/cpython/script.py']
sys.path[0]='/Users/chenxiangan/cpython'

但是对于下面这段代码,这段代码请在 Python3.8 下运行

script.js
import sys
import os
modname = 'relpath'
filename = modname + '.py'
sys.path.insert(0, os.curdir)
with open(filename, "w") as fp:print("import sys", file=fp)print("mod = sys.modules[__name__]", file=fp)print("print(f'{__file__=}')", file=fp)print("print(f'{mod.__file__=}')", file=fp)print("print(f'{mod.__cached__=}')", file=fp)
__import__(modname)
os.unlink(filename)

这个代码意思是动态生产下面的代码

import sys
mod = sys.modules[__name__]
print(f'{__file__=}')
print(f'{mod.__file__=}')
print(f'{mod.__cached__=}')

然后执行完上面的代码,通过 os.unlink 删除。

__file__='./relpath.py'
mod.__file__='./relpath.py'
mod.__cached__='./__pycache__/relpath.cpython-38.pyc'

可以看到还是相对路径,这问题是 Cpython 的 Moudles/getpath.c 的一个 bug 修改内容如下

* absolutize() should help us out below
*/else if(0 == _NSGetExecutablePath(execpath, &nsexeclength) &&
-            _Py_isabs(execpath))
+          (wchar_t) execpath[0] == SEP){size_t len;wchar_t *path = Py_DecodeLocale(execpath, &len);

3、在开发模式和调试模式中,使用 encoding 和 decoding 操作的时候加入 encoding 和 errors 两个关键字参数,errors 是声明在编码或者解码的时候出现错误要如何处理。

str.encode(encoding="utf-8", errors="strict")
bytes.decode(encoding="utf-8", errors="strict")¶

改进的模块

classmethod

类方法现在可以装饰其他描述符了,比如property()。

class C:@classmethoddef f(cls): pass@classmethod@propertydef age(cls):print("haha")if __name__ == "__main__":c=C()c.ageprint("over")

输出

haha
over

asyncio

loop.shutdown_default_executor()

调度默认执行程序的关闭,并等待它连接ThreadPoolExecutor中的所有线程。调用此方法后,如果在使用默认执行程序时调用executor()中的loop.run,则会引发RuntimeError。

注意,使用asyncio.run()时不需要调用这个函数。

loop.shutdown_default_executor()

threading

loop.set_default_executor(executor)

将executor设置为executor()中的run使用的默认执行程序。executor应该是ThreadPoolExecutor的一个实例。

all_tasks

从3.7版开始就被弃用了,3.9版中将会删除:不要把它作为任务方法调用。使用asyncio.all_tasks()函数取代。同样的current_task也是用函数asyncio.current_task()取代。

pprint

import types
import pprint
o = types.SimpleNamespace( the=0,quick=1,brown=2,fox=3,jumped=4,over=5,a=6,lazy=7,dog=8)
pprint.pprint(o)

改版前输出

namespace(a=6, brown=2, dog=8, fox=3, jumped=4, lazy=7, over=5, quick=1, the=0)

改版后输出:

namespace(the=0,quick=1,brown=2,fox=3,jumped=4,over=5,a=6,lazy=7,dog=8,c=3)

importlibimportlib.util.resolve_name() 的异常类型也该为了 ImportError 以前是 ValueError。

不再推荐使用的模块用法

  • parse 模块已被弃用,并将在未来的 Python 版本中删除。对于大多数用例,用户可以使用 ast 模块利用抽象语法树 (AST) 生成和编译阶段。

  • random 模块之前接受任何的 hashable 类型作为种子值,不幸的是,其中一些类型不能保证具有确定性的散列值。Python3.9 中种子值将只接受 None, int, float, str, bytes, and bytearray 类型。

移除的模块用法

  • math.factorial(x)

>>> import math
>>> math.factorial(3)
6
>>> math.factorial(3.0)
<stdin>:1: DeprecationWarning: Using factorial() with floats is deprecated
6
  • collection.abc 里面的抽象基类[https://docs.python.org/3.9/library/collections.abc.html#collections-abstract-base-classes],将不在常规的 collection 模块中公开,这有助于在具体类和抽象基类之间创建更清晰的区别。

  • 删除了从 Python 3.2 开始就弃用的 sys.getcheckinterval() 和 sys.setcheckinterval() 函数。它使用 sys.getswitchinterval() 和 sys.setswitchinterval() 来代替。主要作用分别是返回和设置解释器的 “线程切换时间间隔”。

  • 删除了从 Python 3.8 开始不再推荐使用的 threading.Thread 的 isAlive() 方法,使用 is_alive() 代替。

  • 移除 ElementTree 中在 Python3.2 就已经废弃的方法,getchildren() 和 getiterator(),以 list() 和 iter() 代替。同时删除 xml.etree.cElementTree 方法。

  • 删除 3.4 中不支持的旧 plistlib 模块的实现。使用 load(), loads(), dump(), and dumps() 方法。此外,use_builtin_types 参数已删除,始终使用标准字节对象代替。

  • 修正了当 AssertionError 被隐藏时断言语句的错误行为。加入 LOAD_ASSERTION_ERROR 操作码。

后记

需要注意的是这个文档目前只是个草稿格式,随着 Python3.9 的正式发布,一些特性可能还会添加或删除。下面我们看看语言上的变化。

推荐阅读

添加微信[gopython3].回复:回复 Go 或者 Python 加对应技术群。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/408483.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React工作(1)---export导出

import React, { Component } from react;class List extends Component {constructor(props) {super(props);}render() {return <div>1111</div>;} }export default List;

首发:适合初学者入门人工智能的路线及资料下载

本文为AI入门提供了一个简易的学习路线&#xff0c;并提供了代码和数据集下载。&#xff08;黄海广&#xff09;一、前言AI以及机器学习入门&#xff0c;初学者遇到的问题非常多&#xff0c;但最大的问题就是&#xff1a;资料太多&#xff01;&#xff01;&#xff01;看不完&a…

动态SQL中变量赋值

在动态SQL语句中进行变量的值绑定比较麻烦&#xff0c;这儿做个记录 declare COUNT int,sql nvarchar(max) set sql select COUNT count(id) from tbl_sys_dict where root_key WT_TYPE execute sp_executesql sql, NCOUNT int output, COUNT output print COUNT 转载于:htt…

数据结构算法入门--链表

2019 年第 76 篇文章&#xff0c;总第 100 篇文章 本文大约 3200 字&#xff0c;阅读大约需要 10 分钟 数据结构算法系列&#xff1a; 数据结构算法入门系列第三篇--链表&#xff0c;链表也是非常常见的数据结构&#xff0c;面试过程中也会经常考到相关的题目。 本文首先介绍链…

react学习(3)----不能在该位置用setstate

this.setState({ pageIndex: 1, pageSize: 10, });

后台命名查询sql查某几个字段传到前台

dwr调用查出数据库字段 传给前台显示 前台只能接受list 后台数据放进list传入前台 name-quary中 <!-- 定义sql 通过单位id 查单位名称 --> <sql-query name"getStationName"> <![CDATA[ select STATION_ID,STATION_NAME from MF_STATION wher…

带你少走弯路:强烈推荐的Keras快速入门资料和翻译(可下载)

上次写了TensorFlow和PyTorch的快速入门资料&#xff0c;受到很多好评&#xff0c;读者强烈建议我再出一个keras的快速入门路线&#xff0c;经过翻译和搜索网上资源&#xff0c;我推荐4份入门资料&#xff0c;希望对大家有所帮助。备注&#xff1a;另外两个入门资料很负责任地说…

hadoop遇到的问题及处理

1:杀掉hadoop作业 列出作业 ./hadoop job -list杀掉 ./hadoop job -kill job_id1&#xff1a;某些节点出现running asprocess XXX. Stop it first 这是由于各节点登录用户为root&#xff0c;在启动hadoop前&#xff0c;务必将各节点用户切换至普通用户hadoop下&#xff0c;切换…

Mac 下安装配置 Python 开发环境

图片来源&#xff1a;Unsplash&#xff0c;作者 Markus Spiske 2019 年第 77 篇文章&#xff0c;总第 101 篇文章前言记录下 Mac 电脑的开发环境安装配置&#xff0c;主要包括&#xff1a;安装&使用Homebrew安装使用 git安装 anaconda&#xff0c;配置 python3 环境安装 ju…

react学习(5)----通过设置初始值控制页面render渲染

boothActivityCode: this.props.location.query.code || ,

【Android源代码下载】收集整理android界面UI效果源码

在Android开发中&#xff0c;Android界面UI效果设计一直都是很多童鞋关注的问题&#xff0c;今天给大家分享下大神收集整理的多个android界面UI效果&#xff0c;都是源码&#xff0c;都是干货&#xff0c;贡献给各位网友&#xff01; 话不多说&#xff0c;直接上效果图&#xf…

一文了解类别型特征的编码方法

来源&#xff1a;Unsplash&#xff0c;作者&#xff1a;an Rizzari2019 年第 78 篇文章&#xff0c;总第 102 篇文章目录&#xff1a;问题描述数据准备标签编码自定义二分类one-hot 编码总结问题描述一般特征可以分为两类特征&#xff0c;连续型和离散型特征&#xff0c;而离散…

UNIX网络编程--读书笔记

会集中这段时间写UNIX网络编程这本书的读书笔记&#xff0c;准备读三本&#xff0c;这一系类的文章会不断更新&#xff0c;一直会持续一个月多&#xff0c;每篇的前半部分是书中讲述的内容&#xff0c;每篇文章的后半部分是自己的心得体会&#xff0c;文章中的红色内容是很重要…

react学习(6)----react样式多用内联

<div style{{ textAlign: center }}><Button type"primary" style{{ marginRight: 10px }}>保存</Button><Button>取消</Button><Button type"primary" style{{ marginLeft: 10px }}>发布</Button></div>…

如何用栈实现浏览器的前进和后退?

2019 年第 79 篇文章&#xff0c;总第 103 篇文章数据结构与算法系列的第四篇文章&#xff0c;前三篇文章&#xff1a;前言浏览器的前进和后退功能怎么用栈来实现呢&#xff1f;这里先介绍一下栈的定义和实现&#xff0c;并介绍它的一些常用的应用&#xff0c;最后再简单实现一…

iOS开发Objective-C基础之──多态

Objective-C语言是面向对象的高级编程语言&#xff0c;因此&#xff0c;它具有面向对象编程所具有的一些特性&#xff0c;即&#xff1a;封装性、继承性和多态性。 今天介绍一下Objective-C中的多态性。 一、什么是多态 多态&#xff1a;不同对象以自己的方式响应相同的消息的能…

react学习(7)----react转换值同render

{title: 状态,dataIndex: status,render: (text, row) > {let arr [, 未开始, 进行中, 已结束, 已作废];return <span>{arr[text]}</span>;},},

数据科学家令人惊叹的排序技巧

2019 年第 80 篇文章&#xff0c;总第 104 篇文章本文大约 7800 字&#xff0c;阅读大约需要20分钟原题 | Surprising Sorting Tips for Data Scientists作者 | Jeff Hale原文 | https://towardsdatascience.com/surprising-sorting-tips-for-data-scientists-9c360776d7e译者 …

删除Autorun.inf的方法

你的电脑的每个分区根目录都有一个autorun.inf的文件夹&#xff0c;查看属性是只读隐藏&#xff0c;且无法删除、无法取得权限!点进去&#xff0c;却显示的是控制面板的内容? 其实这个不是病毒&#xff0c;而是用来防病毒&#xff0c;一些系统封装工具本身就自带。下面教你删…