首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python3.8 了解的差不多了吧,Python3.9 新特性了解一下!

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

作者头像
kbsc13
发布于 2019-10-24 07:03:46
发布于 2019-10-24 07:03:46
1.8K00
代码可运行
举报
文章被收录于专栏:AI 算法笔记AI 算法笔记
运行总次数:0
代码可运行

正文共:4946 字 1 图

预计阅读时间:13 分钟

作者:陈祥安

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

本文将解释 Python 3.9 中的新特性,而不是 3.8。有关完整的详细信息,请参见更改日志。 https://docs.python.org/3.9/whatsnew/changelog.html#changelog

目前官网只有 3.8 的下载包,3.9 需要自己编译 Cpython,可以参考我之前的文章里面有编译部分的内容,教你阅读 Cpython 的源码(一)

语言上的变化

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"""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 中的删除 +:github 中的增加

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 信息的时候还会显示 __main__模块的绝对路径。(由 Victor Stinner 在 bpo-20443 中贡献。)

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import sys
print(f"{__file__=}")
print(f"{sys.argv=}")
print(f"{sys.path[0]=}")

运行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ ./python3 script.py 

结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
__file__='/Users/chenxiangan/cpython/script.py'
sys.argv=['/Users/chenxiangan/cpython/script.py']
sys.path[0]='/Users/chenxiangan/cpython'

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import sys
mod = sys.modules[__name__]
print(f'{__file__=}')
print(f'{mod.__file__=}')
print(f'{mod.__cached__=}')

然后执行完上面的代码,通过 os.unlink 删除。 输出下面的结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
__file__='./relpath.py'
mod.__file__='./relpath.py'
mod.__cached__='./__pycache__/relpath.cpython-38.pyc'

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
* 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() 和 bytes.decode()。它们的语法结构分别是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
str.encode(encoding="utf-8", errors="strict")
bytes.decode(encoding="utf-8", errors="strict")

改进的模块

classmethod

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class C:
    @classmethod
    def f(cls): 
        pass

    @classmethod
    @property
    def age(cls):
       print("haha")

if __name__ == "__main__":
     c=C()
     c.age
     print("over")

输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
haha
over

asyncio

loop.shutdown_default_executor()

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

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

loop.shutdown_default_executor()

threading 在子解释器中,生成守护进程线程现在会引发异常。子解释器中从不支持守护进程线程。在此之前,如果守护进程线程仍然在运行,则子解释器终止过程会出现 Python 致命错误。(来自 Victor Stinner 提出的 bpo-37266.)方法release,在3.9版本中更改,添加了n参数来同时释放多个等待的线程。

loop.set_default_executor(executor)

将executor设置为executor()中的run使用的默认执行程序。executor应该是ThreadPoolExecutor的一个实例。 从3.8版开始就不推荐:不推荐使用不是ThreadPoolExecutor实例的执行程序,Python 3.9中会触发异常。要求executor必须是concurrent.futures.ThreadPoolExecutor的实例。

all_tasks

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

pprint pprint 现在可以打印漂亮的 types.SimpleNamespace。 补充说明: SimpleNamespace 继承自 object,其作用用来代替 class X: pass 语句 代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)

改版前输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
namespace(a=6, brown=2, dog=8, fox=3, jumped=4, lazy=7, over=5, quick=1, the=0)

改版后输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
namespace(the=0,
          quick=1,
          brown=2,
          fox=3,
          jumped=4,
          over=5,
          a=6,
          lazy=7,
          dog=8,
          c=3)

importlib 提高与 import 语句的一致性 importlib.util.resolve_name() 的异常类型也该为了 ImportError 以前是 ValueError。

不再推荐使用的模块用法

  • parse 模块已被弃用,并将在未来的 Python 版本中删除。对于大多数用例,用户可以使用 ast 模块利用抽象语法树 (AST) 生成和编译阶段。
  • random 模块之前接受任何的 hashable 类型作为种子值,不幸的是,其中一些类型不能保证具有确定性的散列值。Python3.9 中种子值将只接受 None, int, float, str, bytes, and bytearray 类型。

移除的模块用法

  • math.factorial(x) 从3.9版本开始不赞成,带有整数值的浮点数(比如5.0)。下面代码示例
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> 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 参数已删除,始终使用标准字节对象代替。 补充说明: 这个模块提供了一个接口来读写苹果使用的属性列表文件,主要是在 macOS 和 iOS 上。该模块支持二进制和 XML plist 文件。
  • 修正了当 AssertionError 被隐藏时断言语句的错误行为。加入 LOAD_ASSERTION_ERROR 操作码。

后记

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

推荐阅读

Python 爬虫面试题 170 道:2019 版

Python 3.8 发布,新特性解读

华丽的蜕变-使用Pathlib模块,文件操作So Easy!

Python 调用系统命令的模块 Subprocess

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-10-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法猿的成长 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Kafka 并发消费单个 partition
kafka可以通过多个partition实现并发,但是针对单个partition,必须顺序提交。假如消息发送顺序为1,2,3,如果先提交3,会导致1,2被提交。所以不能并发执行后立即提交。
Yuyy
2023/05/01
1.1K0
Go 语言微服务框架 Kratos 服务注册与发现
Go 语言微服务框架 Kratos 服务注册与发现,支持多种注册中心,本文我们以 Consul 为例,介绍 Kratos 项目怎么实现服务注册与发现。
frank.
2025/01/20
2660
Go 语言微服务框架 Kratos 服务注册与发现
kafka-go 读取kafka消息丢失数据的问题定位和解决
segmentio/kafka-go 是一款开源的golang kafka读写sdk,开源地址为:https://github.com/segmentio/kafka-go 。截止写文章时,这个开源代码库收获了3.3K的star,在很多公司内外部项目广泛使用。与 https://github.com/confluentinc/confluent-kafka-go 和 https://github.com/Shopify/sarama 一起,作为最常用的三个golang kafka sdk。
MacroXJTU
2021/04/06
7.4K1
kafka-go 读取kafka消息丢失数据的问题定位和解决
Go 语言微服务框架 Kratos 开发 HTTP API
本文我们分为开发环境,创建项目,代码目录,HTTP API,四个部分介绍 Kratos 微服务框架。
frank.
2024/12/23
5140
Go 语言微服务框架 Kratos 开发 HTTP API
go: 优雅处理kafka消费退出
在业务中,kafka的消费者服务非常常见。主要流程是从kafka中取出消息,处理消息。
超级大猪
2023/11/08
1.2K0
Kratos技术系列|从Kratos设计看Go微服务工程实践
导读 github.com/go-kratos/kratos(以下简称Kratos)是一套轻量级 Go 微服务框架,致力于提供完整的微服务研发体验,整合相关框架及周边工具后,微服务治理相关部分可对整体业务开发周期无感,从而更加聚焦于业务交付。Kratos在设计之初就考虑到了高可扩展性,组件化,工程化,规范化等。对每位开发者而言,整套 Kratos 框架也是不错的学习仓库,可以了解和参考微服务的技术积累和经验。 接下来我们从Protobuf、开放性、规范、依赖注入这4个点了解一下Kratos 在Go
腾讯云中间件团队
2021/07/14
2.9K0
go使用消息队列优化接口
在我们编写后端接口时,通常有些接口对于实时性的要求并不是那么高,但其中有些函数却相当占用接口调用时间,如调用第三方接口、发送短信、发送邮件等等。为了提升用户的体验感、系统的稳定性,此时我们就可以使用消息队列对于接口进行优化,对于实时性要求不高的接口使用消息队列来进行处理,提高api响应速度,优化用户体验。本文将以go语言使用rabbitMQ来演示如何对于一个接口进行优化。
陈杪秋
2024/07/22
1400
Golang实现非常好用的第三方库(一)
正如 这里 和 这里所描述的, Go语言原生的map类型并不支持并发读写。concurrent-map提供了一种高性能的解决方案:通过对内部map进行分片,降低锁粒度,从而达到最少的锁等待时间(锁冲突)
KunkkaWu
2023/03/14
9.1K5
Golang实现非常好用的第三方库(一)
kratos源码分析系列(6)
直接获取当前节点:selector/node/direct/direct.go
golangLeetcode
2023/09/06
6140
kratos源码分析系列(6)
Go 语言微服务框架 Kratos 操作 MySQL 和 Redis
Go 语言微服务框架 Kratos 不限制使用任何第三方库,我们可以根据个人喜好选择第三方库。
frank.
2024/12/30
2280
Go 语言微服务框架 Kratos 操作 MySQL 和 Redis
基于Kafka构建事件溯源模式的微服务
微服务本身并不算什么新概念,它要解决的问题在软件工程历史中早已经有人提出:解耦、扩展性、灵活性,解决“烂架构”膨胀后带来的复杂度问题。
RiboseYim
2018/01/12
2K0
基于Kafka构建事件溯源模式的微服务
Golang超实用第三方库合集
正如 这里 和 这里所描述的, Go语言原生的map类型并不支持并发读写。concurrent-map提供了一种高性能的解决方案:通过对内部map进行分片,降低锁粒度,从而达到最少的锁等待时间(锁冲突)
luckpunk
2025/01/08
5100
go-Kratos微服务框架入门
这是kratos官方挂出的框架设计出发点,比如 简单,高效,扩展性,容错性是十分契合go开发风格的。然而kratos这个框架,无疑将go的这些特性进行了放大。接下来,我会分享一些在使用过程中比较好用的组件与kratos框架结合使用示列。
杜金房
2024/05/20
5440
go-Kratos微服务框架入门
go微服务框架go-micro深度学习(二) 入门例子
    上一篇帖子简单介绍了go-micro的整体框架结构,这一篇主要写go-micro使用方式的例子,中间会穿插一些go-micro的源码,和调用流程图,帮大家更好的理解go-micro的底层。更详细更具体的调用流程和细节,会在以后的帖子里详细讲解。
lpxxn
2018/10/09
3.2K0
go微服务框架go-micro深度学习(二) 入门例子
milvus对象存储和消息中间件设计模式分析
对于这种类型一个是mq,一个是存储,相比工厂方法设计模式,使用抽象工厂设计模式更合理。
melodyshu
2024/04/23
1890
2010年4月20日Go生态洞察:goprotobuf与第三方库的崛起
🐯 猫头虎博主在此!今天,咱们要聊聊Go语言中一个激动人心的进展 —— goprotobuf。如果你在搜索“Go语言第三方库”、“Go protobuf实现”或者“Go与系统互操作性”,你来对地方了!本文将为你提供一个深度分析的视角,看看Go是如何通过这些新工具和库,进一步融入大型系统和多语言环境中的。
猫头虎
2024/04/09
970
2010年4月20日Go生态洞察:goprotobuf与第三方库的崛起
Golang 语言中 kafka 客户端库 sarama
Apache Kafka 是一款开源的消息引擎系统。它在项目中的作用主要是削峰填谷和解耦。本文我们只介绍 Apache Kafka 的 Golang 客户端库 Sarama。Sarama 是 MIT 许可的 Apache Kafka 0.8 及更高版本的 Golang 客户端库。
frank.
2021/05/13
7K0
[Go实战]golang使用mysql实例和第三方库Gendry
Builder用于生成sql语句,手写sql简单直观但是可维护性差,并且硬编码容易出错,如果遇到大where in查询,且in的集合内容又是动态的就很麻烦了。
TOMOCAT
2020/06/10
1.2K0
怎么通过第三方库实现标准库`database/sql`的驱动注入?
在Go语言中,数据库驱动库通常通过注入标准库database/sql来实现。这种机制使得应用程序可以使用统一的接口来操作不同类型的数据库。在本文中,我们将深入探讨github.com/go-sql-driver/mysql库是如何通过注入database/sql标准库来实现MySQL驱动的。
科技新语
2024/06/05
1010
Strimzi Kafka Bridge(桥接)实战之三:自制sdk(golang版本)
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是《Strimzi Kafka Bridge(桥接)实战》的第三篇,前文咱们掌握了Strimzi Kafka Bridge的基本功能:基于http提供各种kafka消息的服务 此刻,如果想通过http接口调用bridge的服务,势必要写不少代码(请求数据的生成、响应数据的解析),好在Strimzi已经提供了标准OpenApi的配置文件,咱们可以
程序员欣宸
2022/12/19
8040
Strimzi Kafka Bridge(桥接)实战之三:自制sdk(golang版本)
推荐阅读
相关推荐
Kafka 并发消费单个 partition
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档