- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在研究实现科学模型的 python 包,我想知道处理可选功能的最佳方法是什么。这是我想要的行为:如果无法导入某些可选的依赖项(例如在 headless 机器上绘制模块),我想在我的类中禁用使用这些模块的功能,警告用户是否尝试使用它们以及所有这些而不破坏执行。所以下面的脚本在任何情况下都可以工作:
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 ...
除了...
声明这些选项应该可以工作,但它们似乎都很笨拙且难以维护。如果我们想完全放弃依赖怎么办?还是强制执行?
最佳答案
当然,最简单的解决方案是在需要它们的函数体中简单地导入可选依赖项。但是永远正确的PEP 8
说:
Imports are always put at the top of the file, just after any module comments and docstrings, and before module globals and constants.
不想违背 python 大师们的美好愿望,我采用了以下方法,它有几个好处......
假设我的一个函数 foo
需要 numpy
,我想让它成为一个可选的依赖项。在模块的顶部,我放置了:
try:
import numpy as _numpy
except ImportError:
_has_numpy = False
else:
_has_numpy = True
此处(在 except block 中)将是打印警告的地方,最好使用 warnings
模块。
如果用户调用 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
和 sklearn
,它们是可选。
使用这种方法,您的具体问题的答案如下:
我们可以简单地将我们的可选依赖项添加到我们的设置工具的必需依赖项列表中。在上面的示例中,我们将 numpy
移动到 install_requires
。然后可以删除所有检查 numpy
是否存在的代码,但保留它不会导致程序中断。
只需删除之前需要它的任何函数中的依赖项检查。如果您使用装饰器实现了依赖性检查,您可以只更改它,使其简单地通过原始函数而不改变。
这种方法的好处是将所有导入都放在模块的顶部,这样我就可以一眼看出什么是必需的,什么是可选的。
关于python - 如何正确处理python中的可选特性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27361427/
目录 C#特性 1. 概括 2. 语法 定义特性类 应用特性
是否有关于 Python 语言必须提供哪些功能的文章/论文?为什么应该使用 Python 而不是任何其他语言? Python 的优点和缺点是什么? 最佳答案 Why Python和 Why Pytho
我想弄清楚为什么 .x比*.x具有更高的特异性当后者有望获胜时。 不是*.x应该具有 0-0-1-1 的特异性(1 个类,1 个标签)而 .x只是一个类(class) 0-0-1-0 ? 考虑以下基本
在尝试评估非 instanceof 条件时,我发现了我在 Groovy 2.4.7、1.6.0 JVM 中没有预料到的行为。 总之: class Foo { static Boolean
当使用可变结构和属性时,编译器可以解决一些问题,但不能对其他相当明显的事情做同样的事情,这对我来说似乎很奇怪。 以下面的自动属性为例: Vector2 Vector { get; set; } 而不是
我对 ES3 有一定的了解,但我对 ES5 的特性不是很了解。我 - 或多或少 - 知道: Object.create(), Object.freeze() “使用严格” getter 和 sette
我最近开始将 Django 1.5.4 用于带有 MySQL 后端的 Web 应用程序。就在一开始,我遇到了某些限制,这让我想知道 Django 是否是继续前进的正确方法。 一些明显的缺点是: 缺少复
在函数模板的定义中,模板参数的实例化一般是未知的。类型特征可用于在编译时获取一些信息。例如,这是 is_pointer 的一个简单应用: template void foo(T p) { cout
我正在设计页面的样式,该页面具有除最后一个框外的带底部边框的连续框。我为所有框应用类 .box 并添加 .box_last 以仅隐藏最后一个框的边框。 .box { border-bottom-s
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我有兴趣编制一份不建议在嵌入式系统中使用的 c++ 功能列表(这可能会导致人们推荐使用 c 而不是 c++)。如果您知道,请尝试添加原因,或者将您的原因添加到其他人的答案中。 这是一个开始(我知道的唯
作为一名 Ruby 程序员,您是否曾觉得任何使用起来有点冒险的功能,可能是因为它的奇怪行为?它可能有很好的文档记录,但在调试时很难找到,或者难以记住? 我通常尽量远离 String#gsub!。文档说
我正在开发一个连接到健身 watch 的蓝牙应用程序。这是我第一次使用蓝牙。我设法使用出色的 FlutterBlue 将我的应用程序与设备连接起来图书馆。 但是我无法理解我从阅读中获得的结果。这是我阅
1. 迭代器(Iterator)的介绍 背景:指针可以用来遍历存储空间连续的数据结构,但是对于存储空间费连续的,就需要寻找一个行为类似指针的类,来对非数组的数据结构进行遍历。 定义:迭代器是一种检
嗨,伙计们,有没有动态更改 Spring 属性文件内容的好例子?如果您能给我一些示例或链接,我将不胜感激。 非常感谢 最佳答案 我想你可以使用 ReloadableResourceBundleMess
SystemVerilog 引入了一些非常有用的结构来改进编码风格。然而,正如我的一位同事经常说的,“你不是在写软件,你是在描述硬件。”考虑到这一点,当最终结果需要合成时,应该避免语言的哪些特征?这个
我定义了这些测试依赖项 / Test Dependencies lazy val wiremock = "com.github.tomakehurst" % "wir
我正在为 Android 手机和 Android watch (wearOS) 编写应用程序。这些应用程序将通过蓝牙相互通信。基本上,Android 手机上的应用程序将与 WearOS 设备绑定(bi
我正在为 Android 手机和 Android watch (wearOS) 编写应用程序。这些应用程序将通过蓝牙相互通信。基本上,Android 手机上的应用程序将与 WearOS 设备绑定(bi
我有兴趣提高我的设计能力(设计具有属性、方法等的类)。即如何决定类、方法和属性应该是什么? 你们能建议我改进这个的好 Material 吗? 最佳答案 请看: Any source of good o
我是一名优秀的程序员,十分优秀!