用 Python 3.8 中的这个位置技巧让你的 API 变得更好

开发 后端
这是 Python 3.x 首发特性系列文章的第九篇。Python 3.8 于 2019 年首次发布,两年后,它的许多很酷的新特性仍然没有被使用。

[[404288]]

探索只接受位置参数和其他两个未被充分利用但仍然有用的 Python 特性。

这是 Python 3.x 首发特性系列文章的第九篇。Python 3.8 于 2019 年首次发布,两年后,它的许多很酷的新特性仍然没有被使用。下面是其中的三个。

importlib.metadata

入口点 在 Python 包中被用来做各种事情。大多数人熟悉的是 console_scripts 入口点,不过 Python 中的许多插件系统都使用它们。

在 Python 3.8 之前,从 Python 中读取入口点的最好方法是使用 pkg_resources,这是一个有点笨重的模块,它是 setuptools 的一部分。

新的 importlib.metadata 是一个内置模块,它允许访问同样的东西:

  1. from importlib import metadata as importlib_metadata
  2.  
  3. distribution = importlib_metadata.distribution("numpy")
  4. distribution.entry_points
  1.     [EntryPoint(name='f2py', value='numpy.f2py.f2py2e:main', group='console_scripts'),
  2.      EntryPoint(name='f2py3', value='numpy.f2py.f2py2e:main', group='console_scripts'),
  3.      EntryPoint(name='f2py3.9', value='numpy.f2py.f2py2e:main', group='console_scripts')]

入口点并不是 importlib.metadata 允许访问的唯一东西。可以调试、报告,或者(在极端情况下)触发兼容模式,你也可以在运行时检查依赖的版本!

  1. f"{distribution.metadata['name']}=={distribution.version}"`[/code] [code]`    'numpy==1.20.1'

只接受位置参数

强制关键字的参数在传达 API 作者的意图方面取得巨大成功之后,另一个空白被填补了:只接受位置参数。

特别是对于那些允许使用任意关键字的函数(例如,生成数据结构),这意味着对允许的参数名称的限制更少:

  1. def some_func(prefix, /, **kwargs):
  2.     print(prefix, kwargs)
  1. some_func("a_prefix", prefix="prefix keyword value")
  1.   a_prefix {'prefix': 'prefix keyword value'}`

注意,令人困惑的是,变量 prefix 的值与 kwargs["prefix"] 的值不同。就像在很多地方一样,要注意小心使用这个功能。

自我调试表达式

50 多年来,print() 语句(及其在其他语言中的对应语句)一直是快速调试输出的最爱。

但是我们在打印语句方面取得了很大的进展,比如:

  1. special_number = 5
  2. print("special_number = %s" % special_number)
  1.     special_number = 5

然而,自我记录的 f-strings 使它更容易明确:

  1. print(f"{special_number=}")
  1.     special_number=5`

在 f-string 插值部分的末尾添加一个 =,可以保留字面部分,同时添加数值。

当更复杂的表达式在该部分内时,这就更有用了:

  1. values = {}
  2. print(f"{values.get('something', 'default')=}")
  1.     values.get('something', 'default')='default'

欢迎来到 2019 年

 

Python 3.8 大约在两年前发布,它的一些新特性非常酷,而且没有得到充分利用。如果你还没使用,那么将他们添加到你的工具箱中。

 

责任编辑:庞桂玉 来源: Linux中国
相关推荐

2014-05-07 09:41:21

UbuntuTrusty Tahr

2015-10-30 10:33:02

沟通程序员事业发展

2020-11-20 10:40:20

PyTorch神经网络代码

2020-08-06 00:25:38

Python代码开发

2023-01-04 08:17:21

Typescript技巧欺骗性

2009-11-20 09:20:09

MySQL分区负载均衡

2021-09-01 10:35:19

asyncawaitVue

2023-03-27 23:57:25

JavaScrip开发技巧

2021-01-27 10:46:07

Pytorch深度学习模型训练

2020-07-20 10:40:52

Linux命令Ubuntu

2020-12-30 05:29:48

API分库分表

2023-12-01 15:34:03

Python图片

2019-05-21 14:08:40

豆瓣Python图书

2024-06-13 12:24:06

C++开发代码

2023-03-09 15:45:36

ES6编码技巧数组

2009-11-30 11:33:01

2020-07-24 15:40:51

CSS前端代码

2021-06-16 18:16:22

Windows 10Windows操作系统

2021-01-14 22:13:03

人工智能教育互联网

2018-07-12 14:56:11

机箱装机风扇
点赞
收藏

51CTO技术栈公众号