Python3.9 中的一些特性

PEP 584 使用 | 和|= 符号取字典的并集

  • 为什么需要这个新特性:
    • 现有合并字典的方法:
# 1. 合并d1, d2, 用inplace的方式修改了字典d1
d1.update(d2) 

# 2. 如果不想修改d1,就采用下面的代码:把d1复制到一个新字典,再对新字典使用update()方法
e = d1.copy()
e.update(d2)

# 3. 或者是这样,但比较丑陋,且不易理解:
{**d1, **d2}

# 4. 使用collections.ChainMap, 对新字典的修改依然会作用于原字典:
>>> a
{'a': 1, 'b': 2}
>>> b
{'a': 100, 'b': 10}
>>> merged = ChainMap(a, b)
>>> merged['a'] = 0
>>>> a
{'a': 0, 'b': 2}

# 5. 一种比较优雅的方法:1. 简洁,2. 不是inpalce的修改,3. 创建的新字典的引用不再指向原字典。但是在这里d2的键必须是字符串,其他的hashable行不通:
dict(d1, **d2)
  • 新的方法 | (merge) 这样使用:
>>> d = {'spam': 1, 'eggs': 2, 'cheese': 3}
>>> e = {'cheese': 'cheddar', 'aardvark': 'Ethel'}
>>> d | e
{'spam': 1, 'eggs': 2, 'cheese': 'cheddar', 'aardvark': 'Ethel'}
>>> e | d
{'aardvark': 'Ethel', 'spam': 1, 'eggs': 2, 'cheese': 3}
  • 如果合并的两个字典存在相同的键,结果的value为最右边的字典的value,如d|e中的cheese对应的value就是字典e中的cheddar,而e|d则是字典d中的3
  • 对于|= (update), 以inplace的方式修改原字典:
d |= e

PEP 585 标准集合的类型提示

  • 为了让函数、方法调用者明白每个参数的类型,我们往往会加入类型提示,这些类型都来自于typing模块:
from typing import List, Tuple, Dict

def foo(a: List[int], b: Tuple) -> Dict:
    pass
  • 从python3.7开始,也可以这样写:
from __future__ import annotations

def find(haystack: dict[str, list[int]]) -> int:
	pass
  • 但是一些外部工具,例如用于静态类型检查的Mypy不能将这种写法识别为通用类型
  • 在Python3.9 运行时的通用类型得到了保留,因此,可以直接这样写:
>>> list[str]
list[str]
>>> tuple[int, ...]
tuple[int, ...]
>>> ChainMap[str, list[str]]
collections.ChainMap[str, list[str]]

PEP 602 Python的主版本将一年更新一次

  • 从Python3.9开始,Python的主版本(3.X.0)将在每年的10月份更新
  • 主版本(3.X.0)开发周期约为17个月
  • 自主版本(3.X.0)发布起,3.X系列将持续维护5年(1年半修复bug, 3年半安全性更新)
  • 当前主版本的第一个beta版发布的时候,开始下个主版本的开发,这样两个主版本的正式发布时间相隔一年,举个例子:
    • 3.9.0开发启动时间:2019-06-04
    • 第一个公测(beta)版本发布时间:2020-05-18 (此时启动3.10.0的开发)
    • 3.9.0开发结束时间:2020-10-05 (开发周期约为17个月)
    • 3.10.0发布时间:2021-10 (开发周期约为17个月)

PEP 615 标准库中的IANA时区数据库的支持

  • Time Zone Database,简称tz或tzinfo,是一组表示地球上各地的时间历史的代码和数据,目前由IANA维护。

  • IANA会根据各地政体的变化而定期更新关于时区边界、UTC和夏令时等的规则。对tz的更新遵循BCP 175流程进行管理。

  • PEP 615中提出了zoneinfo模块,提供了详细的时区实现来支持IANA时区数据库

PEP 616 用以去除前缀和后缀的String方法

  • 为string对象添加两个方法:removeprefix()和removesuffix()
  • Python现有的方法:lstrip() 和 rstrip() 可以起到去除前缀后缀的作用,但它们会去除匹配到的所有字符串:
>>> a = "test_test_test_1234"
>>> a.lstrip("test_")
'1234'
  • 在上述例子中,如果我们期望的是只去除一个test_, 那么就可以使用removeprefix()
  • 用re模块也可以实现类似功能, 但不如使用removeprefix()简洁:
s = "test_test_test_1234"
prefix = "test_"
res = re.sub("^" + re.escape(prefix), '', s)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值