文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python3.9新特性有哪些

2023-06-02 02:14

关注

本篇内容介绍了“Python3.9新特性有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

使用 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 中的删除

+: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 中包的相对导入。

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

__main__模块的绝对路径。(由 Victor Stinner 在 bpo-20443 中贡献。)

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

import sysprint(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.jsimport sysimport osmodname = '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 sysmod = 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);

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

例如 str.encode() 和 bytes.decode()。它们的语法结构分别是

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

改进的模块

classmethod

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

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

输出

hahaover

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 语句

代码:

import typesimport pprinto = 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)

importlib

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

不再推荐使用的模块用法

移除的模块用法

从3.9版本开始不赞成,带有整数值的浮点数(比如5.0)。下面代码示例

>>> import math>>> math.factorial(3)6>>> math.factorial(3.0)<stdin>:1: DeprecationWarning: Using factorial() with floats is deprecated6

补充说明:

这个模块提供了一个接口来读写苹果使用的属性列表文件,主要是在 macOS 和 iOS 上。该模块支持二进制和 XML plist 文件。

“Python3.9新特性有哪些”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯