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,一经查实,立即删除!

相关文章

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

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

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

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

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

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

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

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

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;而离散…

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

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

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

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译者 …

几个有趣的python技巧

2019 年第 82 篇文章&#xff0c;总第 106 篇文章标题 | python-is-cool作者 | chiphuyen原文 | https://github.com/chiphuyen/python-is-cool译者 | kbsc13("算法猿的成长"公众号作者)声明 | 翻译是出于交流学习的目的&#xff0c;欢迎转载&#xff0c;但请保留本文…

20191215周学习总结

最近会打算每周总结一下学习的内容&#xff0c;主要内容可能是看过的书的一些学习笔记、论文阅读、学习的知识点以及推荐一些文章。这周的学习包括&#xff1a;推荐系统的知识点整理机器学习的技巧学习linux下两台机器的ssh免密登陆方式书籍阅读效率方法推荐系统因为工作方向的…

玩转12306之系统登录

【申明&#xff1a;本文所涉及的技术和分析的目的都是为了学习和交流&#xff0c;任何人使用文中所提的技术或成果做出的违法事情与我无关&#xff0c;大家购买火车票还是去12306官网上去购买。】 从今天起&#xff0c;我开始分析12306网站的Http请求&#xff0c;以及编写一个客…

Nginx快速搭建和基本使用

2019年第 83 篇文章&#xff0c;总第 107 篇文章最近在工作中项目需要上线&#xff0c;所以也了解到关于一些部署上线的知识内容&#xff0c;Nginx 就是其中一个知识点&#xff0c;主要是可以用它来进行负载均衡&#xff0c;本文的目录如下&#xff1a;简介安装配置基本使用简介…

第二期周总结

第二期的周总结&#xff0c;这次学习的内容可能没有上次那么广泛&#xff0c;主要是因为这周我负责的模块需要测试并进行上线&#xff0c;所以主要学习了解的就是工程开发方面的内容&#xff0c;准确说是部署上线的内容&#xff0c;所以本周主要简单总结这次上线过程的一些内容…

AI知识点(1)--激活函数

2019年第 84 篇文章&#xff0c;总第 108 篇文章本文大约 5000 字&#xff0c;阅读大约需要 15 分钟AI知识点&#xff08;AI Knowledge&#xff09;系列第一篇文章--激活函数。本文主要的目录如下&#xff1a;激活函数的定义为什么需要激活函数常见的激活函数1. 激活函数的定义…

Linux 定时执行shell 脚本

2019年第 85 篇文章&#xff0c;总第 109 篇文章本文大约2000字&#xff0c;阅读大约需要6分钟crontab 可以在指定的时间执行一个shell脚本以及执行一系列 Linux 命令。定时执行shell 脚本简单给出执行 shell 脚本的步骤。首先是编写一个测试脚本--test.sh# 创建脚本 $ vim tes…

RS(1)--10分钟了解什么是推荐系统

总第 110 篇文章&#xff0c;本文大约 3200 字&#xff0c;阅读大约需要 10 分钟2020 年第一篇技术文章&#xff0c;以一个新的系列开始--推荐系统&#xff08;Recommend System&#xff09;&#xff0c;第一篇文章会简单介绍推荐系统的定义和应用&#xff0c;目录如下&#xf…