本期Python教程将解释 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.""" -:github 中的删除 +:github 中的增加 补充知识: __import__() 函数一般用于动态加载类和函数。 代码示例 r = __import__('requests_html', globals(), locals(), ['HTMLSession'], 0) 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 中贡献。) 通过命令行执行文件的时候 import sys 运行 $ ./python3 script.py 结果 __file__='/Users/chenxiangan/cpython/script.py' 但是对于下面这段代码,这段代码请在 Python3.8 下运行 script.js 这个代码意思是动态生产下面的代码 import sys 然后执行完上面的代码,通过 os.unlink 删除。 输出下面的结果 __file__='./relpath.py' 可以看到还是相对路径,这问题是 Cpython 的 Moudles/getpath.c 的一个 bug 修改内容如下 * absolutize() should help us out below 3、在开发模式和调试模式中,使用 encoding 和 decoding 操作的时候加入 encoding 和 errors 两个关键字参数,errors 是声明在编码或者解码的时候出现错误要如何处理。 例如 str.encode() 和 bytes.decode()。它们的语法结构分别是 str.encode(encoding="utf-8", errors="strict") 改进的模块 classmethod 类方法现在可以装饰其他描述符了,比如property()。 class C: 输出 haha 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 types 改版前输出 namespace(a=6, brown=2, dog=8, fox=3, jumped=4, lazy=7, over=5, quick=1, the=0) 改版后输出: namespace(the=0, importlib 提高与 import 语句的一致性 importlib.util.resolve_name() 的异常类型也该为了 ImportError 以前是 ValueError。 不再推荐使用的模块用法
移除的模块用法
从3.9版本开始不赞成,带有整数值的浮点数(比如5.0)。下面代码示例 >>> import math
补充说明: 这个模块提供了一个接口来读写苹果使用的属性列表文件,主要是在 macOS 和 iOS 上。该模块支持二进制和 XML plist 文件。
后记 需要注意的是这个文档目前只是个草稿格式,随着 Python3.9 的正式发布,一些特性可能还会添加或删除。 |
|
来自: 千锋Python学堂 > 《Python基础教程分享》