【Python】一起来看看Python 3.14 中的5大特性吧

该文章已生成可运行项目,

Python 3.14 预发布版已经来了!这是 Python 社区计划的 7 个版本中的第 3 个 alpha 版本,我简直按捺不住激动的心情。

Python 在市场上已经存在相当长一段时间了,作为一名 Python 开发者,我非常兴奋地告诉大家,Python 正在通过每个新版本逐步进行重大更新。

就在几个月前,我们看到了 Python 3.13 发布时关于 可选 GIL 更改 的重大更新,而我还没从那个激动中缓过来。你可以在这里阅读更多关于 GIL 的更新 —— GIL 不复存在

Python 的最新版本 3.14 带来了一些重大改进,我将在下面列出这些更新。我已经将这次新版本中发布的五大更新整理好了。

1. 重新加载 Python 环境

os.environos.environb 保存了 Python 程序开始时定义的环境变量缓存。

问题在于,当某些环境变量在 Python 脚本之外被更新时,这些缓存并不会自动刷新。

我们都知道 Python 开发者喜欢挑战。Python 社区一直在努力解决这个问题,现在他们带来了好消息。

Python 3.14 中 os 模块的最新更新之一是,通过使用一个新添加的内置函数 os.reload_environ(),可以更新 os.environ 为最新的值。

以下是它的用法 ——


Python 3.14.0a3 (tags/v3.14.0a3:401bfc6, Dec 17 2024, 10:58:10) [MSC v.1942 64 bit (AMD64)] on win32

Type "help", "copyright", "credits" or "license" for more information.

>>> import os

>>> os.environ = os.reload_environ()

>>>

现在,开发者可以使用 reload_environ() 方法将 os.environ 更新为最新的值。

我现在正一边喝着肉桂茶 🍵,一边重新加载我的环境。

注意:****reload_environ() 函数不是线程安全的。如果在另一个线程中修改环境时调用它,行为是未定义的。

2. 不再急切求值注解

在深入这个特性之前,我们先问一个非常重要的问题 ——

什么是注解?

注解 是 Python 代码的一部分,用于提供元数据并支持类型提示。注解提供了关于变量、函数参数和返回值的信息。

照片由 Kelly Sikkema 拍摄,来自 Unsplash

注解帮助程序员添加元数据,说明哪些变量可能期望什么类型的值。

例如 ——


>>> def addition(num1: int, num2: float) -> float:

...   return num1 + num2

  

上面的 addition() 函数使用注解定义了参数和返回类型。

以前,Python 会急切地求值注解。现在,这一点已经改变了。

从 Python 3.14 开始,注解被存储在特殊的 注解函数 中,只有在需要时才会被求值。

这有什么好处?

这一变化旨在使 Python 中的注解在大多数情况下更高效、更实用。

新的 annotationlib 模块提供了检查延迟注解的工具。

注解可以通过以下三种格式进行求值 ——

1. VALUE — 将注解求值为运行时值,类似于早期 Python 版本的行为。

2. FORWARDREF — 这种格式会用特殊标记替换未定义的名称。

3. STRING — 将注解作为字符串返回。

以下示例展示了这些格式的行为 ——


>>> from annotationlib import get_annotations, Format

>>> def func(arg: Undefined):

...   pass

...

>>> get_annotations(func, format=Format.VALUE)

Traceback (most recent call last):

 File "<python-input-10>", line 1, in <module>

  get_annotations(func, format=Format.VALUE)

  ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^

 File "C:\Users\varun\AppData\Local\Programs\Python\Python314\Lib\annotationlib.py", line 707, in get_annotations

  ann = _get_dunder_annotations(obj)

 File "C:\Users\varun\AppData\Local\Programs\Python\Python314\Lib\annotationlib.py", line 847, in _get_dunder_annotations

  ann = getattr(obj, "__annotations__", None)

 File "<python-input-9>", line 1, in __annotate__

  def func(arg: Undefined):

         ^^^^^^^^^

NameError: name 'Undefined' is not defined

  

>>> get_annotations(func, format=Format.FORWARDREF)

{'arg': ForwardRef('Undefined')}

  

>>> get_annotations(func, format=Format.STRING)

{'arg': 'Undefined'}

3. map() 方法中的数组长度检查

在 Python 中,map() 函数的作用类似于循环。它接受一个函数和一个可迭代对象(如列表或元组)作为输入。

对于可迭代对象中的每个元素,map() 都会对其应用给定的函数。这会创建一个新的可迭代对象,其中包含每个函数调用的结果。

本质上,map() 是一种方便的方式,可以对集合中的每个元素应用相同的操作。

以前,你会这样写 map() 功能 ——


>>> def mul(a, b):

...   return a * b

...

>>> l1 = [1, 2, 3, 4]

>>> l2 = [5, 6, 7]

>>> result=list(map(mul,l1,l2))

[5, 12, 21]

这里,l2 包含 3 个元素,而 l1 有 4 个元素。在 Python 3.14 中,可以通过使用 strict=True 标志来更好地处理这种情况 ——


>>> def mul(a, b):

...   return a * b

...

>>> l1 = [1, 2, 3, 4]

>>> l2 = [5, 6, 7]

>>> result=list(map(mul,l1,l2, strict=True))

Traceback (most recent call last):

 File "<python-input-33>", line 1, in <module>

  result=list(map(mul,l1,l2, strict=True))

ValueError: map() argument 2 is shorter than argument 1

4. 解包值 —— 改进的错误信息

对于 Python 开发者来说,当你编写代码并遇到错误时,错误信息是帮助你找出代码问题的关键。

改进的错误信息让你的生活变得更加轻松,尤其是在与早期 Python 版本相比时。

举个例子,考虑以下代码,解包失败时 ——


>>> item1, item2, item3 = 1, 2, 3, 4

Traceback (most recent call last):

 File "<python-input-0>", line 1, in <module>

  item1, item2, item3 = 1, 2, 3, 4

  ^^^^^^^^^^^^^^^^^^^

ValueError: too many values to unpack (expected 3, got 4)

现在,你会得到一个更详细的错误信息 —— ValueError: too many values to unpack (expected 3, got 4)

在过去的几个 Python 版本中,错误信息有了很多改进,你可以在这篇文章中了解更多 ——

5. 两个新的运算符方法

Python 3.14 带来了两个新的运算符方法 ——

1. operator.is_none()

2. operator.is_not_none()

operator.is_none(obj) 等同于 obj is None,而 operator.is_not_none(obj) 等同于 obj is not None

希望你喜欢阅读这篇文章!

本文章已经生成可运行项目
<think>好的,用户问的是如何在Python中导入C++的DLL,并且希望管理起来看起来比较好看、方便。首先,我需要回忆一下Python调用C++ DLL的基本方法。通常的做法是使用ctypes库,或者可能用到C扩展模块,但用户可能更倾向于使用现有的DLL文件,而不是重新编译成Python模块。 接下来,用户提到“管理起来比较好看、方便”,这可能意味着他们希望有一个结构清晰、易于维护和调用的代码结构。可能需要考虑如何组织代码结构,比如将DLL调用封装成类或模块,这样使用起来更直观。 然后,我需要考虑可能的步骤:首先加载DLL,然后定义函数原型,处理参数和返回值类型。ctypes需要指定函数的argtypes和restype,否则可能会出错。此外,错误处理也很重要,比如捕捉异常或者检查返回值。 用户可能还希望有文档或注释,这样其他人阅读代码时更容易理解。另外,可能需要处理不同平台的情况,比如Windows下是.dll,而Linux下是.so,但问题中提到的是C++ DLL,所以可能主要针对Windows。 可能的封装方式:创建一个Python模块,里面包含对DLL函数的封装,使用类来组织,或者提供清晰的函数调用接口。例如,定义一个类来管理DLL的加载和函数调用,这样用户只需要实例化一个对象就可以使用相关功能。 另外,异常处理也是关键点,确保在调用DLL函数时如果出现错误能够被捕获并给出有意义的提示。比如,ctypes的WinDLL可能会抛出异常,或者需要检查返回值。 还需要考虑参数转换的问题,比如C++中的指针、结构体等复杂类型在Python中的对应处理,可能需要使用ctypes的结构体或指针类型。 可能的相关问题包括:如何处理C++中的类方法导出?如何确保数据类型在Python和C++之间正确转换?如何跨平台管理不同的DLL?如何自动化加载DLL路径?或者如何调试Python调用C++ DLL时的常见错误,比如访问冲突或参数不匹配。 总结回答的结构:首先介绍使用ctypes的基本方法,然后给出一个结构清晰的示例代码,展示如何封装DLL调用,最后列出相关问题。需要确保示例代码格式正确,符合用户要求的美观和方便管理的结构。</think>在Python中调用C++编写的DLL时,建议通过封装模块化设计提升代码可读性和可维护性。以下是推荐方案: ```python # dll_wrapper.py import ctypes from ctypes import c_int, c_double, Structure class MyDLL: def __init__(self, dll_path="mylib.dll"): """封装DLL加载与函数定义""" self.dll = ctypes.WinDLL(dll_path) self._setup_functions() def _setup_functions(self): # 定义结构体示例 class ResultStruct(Structure): _fields_ = [("value", c_double), ("status", c_int)] # 函数原型定义 self.dll.Calculate.argtypes = [c_int, c_double] self.dll.Calculate.restype = ResultStruct # 错误处理函数 self.dll.GetLastError.restype = c_int def calculate(self, param1, param2): """封装业务逻辑""" result = self.dll.Calculate(param1, param2) if result.status != 0: raise RuntimeError(f"Error code: {result.status}") return result.value ``` 使用方式: ```python # main.py from dll_wrapper import MyDLL with MyDLL() as mylib: try: output = mylib.calculate(42, 3.14) print(f"计算结果: {output}") except RuntimeError as e: print(f"调用失败: {e}") ``` 优势特点: 1. 异常处理封装:统一错误处理逻辑 2. 类型安全:通过argtypes/restype严格定义 3. 资源管理:使用上下文管理器确保DLL正确释放 4. 文档可读:清晰的函数注释和模块结构
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值