上下文

我们开发了一个Python库,其中包含一个期望类似num-参数的函数.我们在签名中指定这一点并使用Python类型提示:

def cool(value: float | int | List[float | int]) 

🏳 Problem & Goal

在运行时期间,我们注意到也可以传递numpy数字类型,例如np.float16(1.2345).所以我们想:为什么不将"麻木的数字类型"纳入我们的签名中,因为这对使用我们库的社区有利.

然而,我们不希望numpy作为我们的项目的依赖项.我们只想在方法签名中表明我们可以采用floatint、它们的列表或任何"numpy数字类型".如果用户尚未在其系统上安装numpy,则他们应该仍然能够使用我们的库,而忽略他们可能也传递"numpy number类型".

我们不想依赖numpy,因为我们不在我们的库中使用它(除了在我们的方法签名中允许它们的类型).那么为什么将其包含在我们的依赖图中呢?没有理由这样做.少一个依赖越好.

额外要求/背景

  • 我们搜索与所有Python >=3.8版本兼容的答案.
  • (答案应该适用于setuptools>=69.0.)
  • 答案应该是这样的:当我们在IDE(例如VSCode)中输入cool(时,我们会获得正确的Intelligence Sense(Ctrl + Space).
  • This就是我们的pyproject.toml的样子.

努力

  • 我们注意到pyproject.toml文件的选项[project.optional-dependencies],请参阅here.然而,目前尚不清楚这个可选的依赖项声明如何帮助我们在方法签名中提供可选的numpy个数据队列.
  • numpy提供numpy.typing类型注释.是否有可能只依赖这个子包?
  • 我们确实在搜索引擎上搜索并找到了this SO question,但我们的问题更具体地涉及如何只能使用另一个模块中的types.我们还找到了this SO question,但尽管标题中有"可选",但它并不是关于optional种麻木类型的.

推荐答案

推迟注释的判断,仅导入numpy conditionally.

from __future__ import annotations
import typing as t

if t.TYPE_CHECKING:
    import numpy as np

def cool(value: int | np.floating | etc ...):
    ...

现在只有在类型判断时才需要numpy依赖项.

看到PEP 563 – Postponed Evaluation of Annotations

枝节问题...

100 provides the 101 type annotations. Is it somehow possible to only depend on this subpackage?

不,这不可能.

我们注意到pyproject.toml文件的选项[project.optional-dependencies].

它在这里对你没有太大帮助.如果您想要用户可以 Select 加入的"额外"依赖项,它仍然很有用,例如:

pip install mypkg          # install with required dependencies
pip install mypkg[typing]  # install with extra dependencies such as numpy

例如,然后您可以使用它轻松地将包连同软部门一起安装到CI中.

Python相关问答推荐

Python Hashicorp Vault库hvac创建新的秘密版本,但从先前版本中删除了密钥

比较两个二元组列表,NP.isin

使用Keras的线性回归参数估计

如何自动抓取以下CSV

根据不同列的值在收件箱中移动数据

Odoo 14 hr. emergency.public内的二进制字段

log 1 p numpy的意外行为

如何在Django基于类的视图中有效地使用UTE和RST HTIP方法?

使用setuptools pyproject.toml和自定义目录树构建PyPi包

如何从pandas的rame类继承并使用filepath实例化

pandas:排序多级列

索引到 torch 张量,沿轴具有可变长度索引

在Python 3中,如何让客户端打开一个套接字到服务器,发送一行JSON编码的数据,读回一行JSON编码的数据,然后继续?

Polars将相同的自定义函数应用于组中的多个列,

如何使用Azure Function将xlsb转换为xlsx?

为什么按下按钮后屏幕的 colored颜色 保持不变?

通过对列的其余部分进行采样,在Polars DataFrame中填充_null`?

如何在表单中添加管理员风格的输入(PDF)

解析CSV文件以将详细信息添加到XML文件

将时间序列附加到数据帧