python3.7 的新特性详解

  • Post category:Python

Python 3.7 新特性详解

Python 3.7 是一次重要的版本更新,本文将详细介绍 Python 3.7 的新特性,包括:

  1. 代码示例:数据类(Data Classes)
  2. 代码示例:异步生成器(Async Generators)
  3. 代码示例:上下文变量(Context Variables)
  4. 代码示例:f-string 增强(f-strings)
  5. 其他新特性

数据类(Data Classes)

数据类(Data Classes)使得定义和使用一组数据更加容易。数据类通过类似于函数注释的语法声明属性,自动生成 initrepr 和其他方法。例如:

from dataclasses import dataclass

@dataclass
class Person:
    name: str
    age: int

person1 = Person('Alice', 20)
person2 = Person('Bob', 30)

在上面的示例中,@dataclass 装饰器将 Person 类转换为一个数据类。 nameage 是实例属性,而且会被代码自动生成。此外,数据类还可以通过 @dataclass 的参数来自定义比较和哈希运算规则等行为。

异步生成器(Async Generators)

异步生成器(Async Generators)使得异步迭代更加容易。异步生成器是一种特殊的生成器,支持异步的 await 操作。例如:

async def async_generator():
    for i in range(3):
        await asyncio.sleep(1.0)
        yield i

async def main():
    async for v in async_generator():
        print(v)

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

在上面的示例中,async_generator 是一个异步生成器,每一次 yield 都会暂停,直到 await asyncio.sleep(1.0) 之后继续执行。 async for v in async_generator() 可以通过异步迭代方式获取异步生成器的返回值。

上下文变量(Context Variables)

上下文变量(Context Variables)是一种新的语言特性,可以让使用 with 语句块的代码访问全局状态。例如:

import contextvars

var = contextvars.ContextVar('name')
var.set('Alice')

def func():
    print(f'Hello, {var.get()}')

func()  # Hello, Alice

async def async_func():
    print(f'Hello, {var.get()}')

await async_func()  # Hello, Alice

在上面的示例中,var 是一个上下文变量,它可以被 funcasync_func 中使用。上下文变量不会被 with 语句块所影响,而是在运行时根据上下文环境确定变量的值。

f-string 增强(f-strings)

f-string 增强(f-strings)是一种新的字符串格式化方式,可以在格式化字符串中使用表达式和函数调用。例如:

name = 'Alice'
age = 20
print(f'{name=} {age=} {age * 2=}')

在上面的示例中,f-string 中的 = 表示输出变量名和变量值,age * 2 可以在 f-string 中直接使用表达式,而不需要先计算出结果。

其他新特性

除了上面提到的新特性之外,Python 3.7 还有其他一些新特性,包括:

  • async 和 await 关键字现在是 Python 3.7 的关键字
  • 返回多个值的函数可以使用 return a, b, c 的方式代替 return [a, b, c]
  • __getattr____setstate__ 可以用于 pickle 工具
  • time_perf_countertime_process_time 可以获得更加精确的时间戳

更多的信息可以查看 PEP 562Python 官方文档