如何正确处理Python中的可选功能

2024-03-20

我正在开发实现科学模型的 python 包,我想知道处理可选功能的最佳方法是什么。 这是我想要的行为: 如果无法导入某些可选依赖项(例如,在无头机器上绘制模块),我想在我的类中禁用使用这些模块的功能,警告用户如果他尝试使用它们以及所有这些,而不会破坏执行。 所以下面的脚本在任何情况下都可以工作:

mymodel.dostuff()
mymodel.plot() <= only plots if possible, else display log an error 
mymodel.domorestuff() <= get executed regardless of the result of the previous statement

到目前为止,我看到的选项如下:

  • 签入__init __.py获取可用模块并保留一个列表 它们(但如何在包的其余部分正确使用它?)
  • 对于每个依赖可选依赖项的函数都有一个try import ... except ...陈述
  • 将取决于特定模块的函数放在单独的文件中

这些选项应该有效,但它们似乎都相当老套且难以维护。如果我们想完全放弃依赖怎么办?或强制执行?


当然,最简单的解决方案是简单地将可选依赖项导入到需要它们的函数体中。但永远正确的PEP 8 https://www.python.org/dev/peps/pep-0008/#imports says:

导入始终放在文件顶部,紧接在任何模块之后 注释和文档字符串,以及模块全局变量和常量之前。

不想违背 python 大师的良好愿望,我采取以下方法,它有几个好处......

首先,使用 try- except 导入

说一下我的一个功能foo needs numpy,我想让它成为一个可选的依赖项。在模块的顶部,我放置了:

try:
    import numpy as _numpy
except ImportError:
    _has_numpy = False
else:
    _has_numpy = True

这里(在 except 块中)是打印警告的地方,最好使用warnings https://docs.python.org/2/library/warnings.html#module-warnings module.

然后在函数中抛出异常

如果用户打电话怎么办foo并且没有numpy?我在那里抛出异常并记录此行为。

def foo(x):
    """Requires numpy."""
    if not _has_numpy:
        raise ImportError("numpy is required to do this.")
    ...

或者,您可以使用装饰器并将其应用于需要该依赖项的任何函数:

@requires_numpy
def foo(x):
    ...

这样做的好处是可以防止代码重复。

并将其作为可选依赖项添加到安装脚本中

如果您要分发代码,请了解如何将额外的依赖项添加到安装配置中。例如,与setuptools,我可以写:

install_requires = ["networkx"],

extras_require = {
    "numpy": ["numpy"],
    "sklearn": ["scikit-learn"]}

这指定了networkx在安装时绝对需要,但是我的模块的额外功能需要numpy and sklearn,这是可选的。


使用这种方法,以下是您的具体问题的答案:

  • 如果我们想强制依赖怎么办?

我们可以简单地将可选依赖项添加到安装工具的所需依赖项列表中。在上面的例子中,我们移动numpy to install_requires。所有代码检查是否存在numpy然后可以将其删除,但保留它不会导致程序中断。

  • 如果我们想完全放弃依赖怎么办?

只需删除对以前需要它的任何函数中的依赖项的检查即可。如果您使用装饰器实现了依赖性检查,则只需更改它即可使其简单地传递原始函数而不改变。

这种方法的好处是,将所有导入都放在模块的顶部,这样我就可以一目了然地看到什么是必需的,什么是可选的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何正确处理Python中的可选功能 的相关文章

  • Flask 中“缺少 CSRF 令牌”,但它在模板中呈现

    问题 当我尝试登录 使用 Flask login 时 我得到Bad Request The CSRF session token is missing但令牌正在呈现 在模板中 secret key 已设置 并且我在本地运行localhost
  • Keras model.predict 函数给出输入形状错误

    我已经在 Tensorflow 中实现了通用句子编码器 现在我正在尝试预测句子的类概率 我也将字符串转换为数组 Code if model model type universal classifier basic class probs
  • 雅虎财务请求功能出现 404 客户端错误

    yahoo Financials的请求功能出现404 Client Error 直接点击以下网址没有问题 https finance yahoo com quote AAPL financials p AAPL https finance
  • 使用 NumPy 编写一个函数来计算具有特定公差的积分

    我想编写一个自定义函数来以特定容差对表达式 python 或 lambda 函数 进行数字积分 我知道与scipy integrate quad人们可以简单地改变epsabs但我想使用 numpy 自己编写该函数 From 这篇博文 htt
  • 用 Python 绘制直方图

    我有两个列表 x 和 y x 包含字母表 A Z Y 包含它们在文件中的频率 我尝试研究如何在直方图中绘制这些值 但在理解如何绘制它方面没有成功 n bins patches plt hist x 26 normed 1 facecolor
  • Django 多对多关系(类别)

    我的目标是向我的 Post 模型添加类别 我希望以后能够按不同类别 有时是多个类别 查询所有帖子 模型 py class Category models Model categories 1 red 2 blue 3 black title
  • 为什么 re.findall 在查找字符串中的三元组项时不具体。 Python

    所以我有四行代码 seq ATGGAAGTTGGATGAAAGTGGAGGTAAAGAGAAGACGTTTGA OR 0 re findall r ATG 9 TAA TAG TGA seq 首先让我解释一下我正在尝试做什么 如果这令人困惑
  • 查找与另一列 Pandas 中的唯一值关联的列中的值的交集

    如果我有一个像这样的数据框 非常小的例子 col1 col2 0 a 1 1 a 2 2 b 1 3 b 2 4 b 4 5 c 1 6 c 2 7 c 3 我想要所有的交集col2当价值观与其独特性相关时col1值 因此在这种情况下 交集
  • Py2exe - Pmw WindowsError:[错误 3]

    我正在尝试使用 Py2exe 构建独立的可执行文件 我已经导入了 Pmw 类 当我运行独立可执行文件时 出现以下错误 Traceback most recent call last File py line 9 in
  • 在请求中设置端口

    我正在尝试利用cgminer使用 Python 的 API 我对利用requests图书馆 我了解如何做基本的事情requests but cgminer想要更具体一点 我想缩小 import socket import json sock
  • 使用 Python 绘制 USGS 水文数据甘特图?

    我编译了一个数据帧 其中包含几个不同流计的 USGS 流数据 现在我想创建一个类似的甘特图this https stackoverflow com questions 31820578 how to plot stacked event d
  • Python:在字典中查找具有唯一值的键?

    我收到一个字典作为输入 并且想要返回一个键列表 其中字典值在该字典的范围内是唯一的 我将用一个例子来澄清 假设我的输入是字典 a 构造如下 a dict a cat 1 a fish 1 a dog 2 lt unique a bat 3
  • Seaborn 中没有线性拟合的散点图

    我想知道是否有办法关闭seaborn中的线性拟合lmplot或者是否有一个等效函数可以生成散点图 当然 我也可以使用 matplotlib 但是 我发现 seaborn 中的语法和美学非常吸引人 例如 我想绘制以下情节 import sea
  • 无法导入QUERY_TERMS

    我正在运行一个网站Python and Django Django filters 2 1 installed Django 2 1 installed 当我运行时 我收到以下错误 importError Could not import
  • 从迭代器外部将 StopIteration 发送到 for 循环

    有几种方法可以打破一些嵌套循环 他们是 1 使用中断 继续 for x in xrange 10 for y in xrange 10 print x y if x y gt 50 break else continue only exec
  • 导入 pandas 显示 ImportError: 无法导入名称哈希表

    我已经在 python 3 3 上安装了 pandas 代码如下 import csv import pandas from pandas import DataFrame csvdata pandas read csv datafile
  • Python 2.7 缩进错误[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这个问题是由拼写错误或无法再重现的问题引起的 虽然类似的问题可能是on topic help on topic在这里 这个问题的解决方式不
  • 如何创建用于霍夫曼编码和解码的树?

    对于我的作业 我将对霍夫曼树进行编码和解码 我在创建树时遇到问题 并且陷入困境 不要介意打印语句 它们只是让我测试并查看函数运行时的输出是什么 对于第一个 for 循环 我从主块中用于测试的文本文件中获取了所有值和索引 在第二个 for 循
  • Python:如何在不先创建整个列表的情况下计算列表的总和?

    通常我们必须 1 声明一个列表 2 使用以下方法计算该列表的总和sum 但现在我希望指定一个以 1 开头 间隔为 4 100 个元素的列表 如下所示 1 5 9 13 17 21 25 29 33 37 我不想涉及数学公式 所以 1 如何在
  • 使用 pandas 单元格中列表的长度选择行[重复]

    这个问题在这里已经有答案了 我有一张表 df a b c 1 x y x 2 x z c d 3 x t e f g 只是想知道如何使用 c 列的长度选择行 such as df loc len df c gt 1 我知道这是不对的 正确的

随机推荐

  • 为什么使用 number_format() 我的数值会发生变化?

    下面的代码给了我两个不同的输出 number 1562798794365432135246 echo number echo number format number 谁能解释一下吗 编辑 忘了提及 上面给了我 15627987943654
  • 将 XPCOM 组件公开给网页中的 javascript

    我想编写一个 XPCOM 组件 该组件在网页中作为 JavaScript 对象公开 我正在寻找像 Google Gears 这样的东西 也就是说 安装 Google Gears Firefox 扩展后 任何想要使用它的网页都可以使用 jav
  • 使 Windows 服务像从特定用户运行一样运行

    我想创建一个 Windows 服务来安装和卸载真密码 http www truecrypt org 体积 这个问题与 true crypt 无关 所以如果您不知道该程序是什么也没关系 True Crypt 只是一个使您能够加密数据的程序 当
  • 从 PHP 上传多个文件到 Amazon S3

    有没有一种方法可以一次性上传多个文件 而不必为每个文件重新连接 我使用 S3 作为我的 php 应用程序的存储 该应用程序需要存储大量 一次 100 个 大多数较小 大约 10k 的图像文件 目前我正在循环遍历它们并使用以下代码为每个单独上
  • ASP.NET Core 无法在 IIS 下运行:HTTP 错误 500.0 - ANCM 进程内处理程序加载失败

    我刚刚将我的 Web 应用程序从 ASP NET Framework MVC 升级到 ASP NET Core 2 2 该应用程序在 IIS Express 下运行良好 但是当我尝试在 IIS 下运行它时 它会给出一般错误 HTTP 错误
  • react-test-renderer create() 与 @testing-library/react render()

    我是 React 新手 对所有测试库感到困惑 我的测试代码可以工作 但调用似乎是多余的create 来自react test renderer以便使用它的toMatchSnapshot 并且必须打电话render 来自 testing li
  • 如何使用 C# 将 json 插入到 cosmos db 集合中

    我有一个 Json 文件 我想将其存储在 cosmos DB 集合中 如何使用 C 添加完整的 Json 文件 有同样的客户端库吗 我已经浏览过以下网址微软网址 https learn microsoft com en us azure c
  • 在 python 3 中使用 python 2 架子

    我将数据存储在使用 python 2 7 创建的架子文件中 当我尝试从 python 3 4 访问该文件时 出现错误 gt gt gt import shelve gt gt gt population shelve open shelve
  • jQuery 向上计数

    我不太擅长 javascript 但我希望有一个漂亮的小动画 可以向上计数数字 我发现了this http sophilabs github io jquery counter 在 Github 上 但是速度很慢 我正在计算一个小数点后10
  • Django Collectstatic 命令在 AWS Elastic Beanstalk Amazon Linux 2 Python 3 平台中失败

    几天来 我一直在努力使用 Amazon Linux 2 Python 3 7 平台将 Django 应用程序部署到 Elastic Beanstalk 设法部署应用程序后 我无法运行命令python3 manage py collectst
  • 如何在 didSelectRowAtIndexPath 之后运行prepareForSegue?

    我正在尝试获取indexPath row该用户单击 然后检查我的数组以从中返回一个字符串indexPath row然后通过prepareforSegue发送字符串 但它不起作用 我认为该程序在之前运行了prepareForSeguedids
  • SignalR hub 中的上下文为空

    我有一个 Web 表单应用程序并进行测试 以了解 SignalR 如何满足我的要求之一 我的中心代码 using System using System Collections Generic using System Linq using
  • pip install enum 无法正常工作,显示“intflag”的错误没有

    pip 安装枚举 不工作显示错误 AttributeError 模块 enum 没有属性 IntFlag enum34 is the stdlib Enum backport but it only supports features fo
  • 在 python 中并行化这个嵌套 for 循环

    我再次努力提高这段代码的执行时间 由于计算确实非常耗时 我认为最好的解决方案是并行化代码 我首先使用地图 如中所述this https stackoverflow com questions 29217088 parallelize a n
  • 从 DOM 中删除空节点元素

    在没有 jQuery 的情况下从 dom 中识别和删除空元素的最佳方法是什么 如果我有如下所示的代码 div div p p div div p Some content p div div 摆脱空虚的最好方法是什么 p and p div
  • 在 C++ 中清除内存中的回车符

    我有以下代码 int main Variables char name Take the users name as input cout lt lt Please enter you name lt lt endl cin gt gt n
  • 模拟詹金斯管道步骤

    我在 jenkinsfile 中使用了一个类 这里 是它的简化版本 class TestBuild def build jenkins jenkins script jenkins sh returnStdout true script e
  • 渐进式 Web 应用程序的预期启动体验是什么?

    测试渐进式 Web 应用程序 当我在飞行模式下启动应用程序时 我得到了意外的启动 启动体验 Android Chrome 从主屏幕体验启动 我看到一个白色的屏幕 然后是 离线恐龙 的短暂闪烁 然后应用程序成功启动 一切正常 启动时间比我预期
  • 如何自定义ARC-Welder的屏幕尺寸?

    我想将 ARC Welder chrome extension 的屏幕尺寸更改为 7 英寸屏幕 显示在我的电脑上 以在不同的屏幕尺寸上测试应用程序 这可以使用例如元数据输入来完成吗 类似于我最近问的问题 但我认为答案相同 似乎在外形规格方面
  • 如何正确处理Python中的可选功能

    我正在开发实现科学模型的 python 包 我想知道处理可选功能的最佳方法是什么 这是我想要的行为 如果无法导入某些可选依赖项 例如 在无头机器上绘制模块 我想在我的类中禁用使用这些模块的功能 警告用户如果他尝试使用它们以及所有这些 而不会