通过 Python 3.8 的这个位置技巧改进你的 API

探索仅位置参数和另外两个未被充分利用但仍然有用的 Python 功能。
62 位读者喜欢这个。
Women in computing and open source v5

kris krüg

这是关于 Python 3.x 版本中首次出现的功能系列文章中的第九篇。Python 3.8 于 2019 年首次发布,两年后,它的许多酷炫新功能仍然未被充分利用。以下是其中的三个。

importlib.metadata

入口点在 Python 包中用于各种用途。最常见的是 console_scripts 入口点,但 Python 中的许多插件系统都使用它们。

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

新的 importlib.metadata 是一个内置模块,它允许访问相同的内容

from importlib import metadata as importlib_metadata

distribution = importlib_metadata.distribution("numpy")
distribution.entry_points
    [EntryPoint(name='f2py', value='numpy.f2py.f2py2e:main', group='console_scripts'),
     EntryPoint(name='f2py3', value='numpy.f2py.f2py2e:main', group='console_scripts'),
     EntryPoint(name='f2py3.9', value='numpy.f2py.f2py2e:main', group='console_scripts')]

入口点不是 importlib.metadata 允许访问的唯一内容。为了调试、报告或(在极端情况下)触发兼容模式,您还可以检查依赖项的版本——在运行时!

f"{distribution.metadata['name']}=={distribution.version}"
    'numpy==1.20.1'

仅位置参数

在仅关键字参数成功传达 API 作者的意图之后,另一个空白被填补:仅位置参数。

特别是对于允许任意关键字的函数(例如,生成数据结构),这意味着对允许的参数名称的约束更少

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

请注意,令人困惑的是,变量 prefix 的值与 kwargs["prefix"] 的值不同。与许多地方一样,请注意谨慎使用此功能。

自调试表达式

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

但是我们在像这样的打印语句中取得了很大进展

special_number = 5
print("special_number = %s" % special_number)
    special_number = 5

然而,自文档化的 f 字符串使清晰表达变得更加容易

print(f"{special_number=}")
    special_number=5

在 f 字符串插值部分的末尾添加 = 会保留字面部分,同时添加值。

当更复杂的表达式位于该部分内时,这甚至更有用

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

欢迎来到 2019 年

Python 3.8 大约在两年前发布,它的一些新功能很酷——而且未被充分利用。如果您还没有这样做,请将它们添加到您的工具箱中。

接下来阅读什么
标签
Moshe sitting down, head slightly to the side. His t-shirt has Guardians of the Galaxy silhoutes against a background of sound visualization bars.
Moshe 自 1998 年以来一直参与 Linux 社区,帮助举办 Linux “安装聚会”。他自 1999 年以来一直编写 Python 程序,并为核心 Python 解释器做出了贡献。Moshe 在 DevOps/SRE 这些术语出现之前就已经是 DevOps/SRE,他非常关心软件可靠性、构建可重现性以及其他此类事情。

评论已关闭。

© . All rights reserved.