作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个使用 pybind11 进行 Python 绑定(bind)的 C++ 类。
现在我想将一种方法的绑定(bind)标记为已弃用。让我们假设它看起来像这样:
PYBIND11_MODULE(my_module, m)
{
pybind11::class_<Foobar>(m, "PyFoobar")
.def("old_foo", &Foobar::foo) // <-- this is deprecated in favour of "new_foo"
.def("new_foo", &Foobar::foo);
}
PyFoobar.old_foo()
的最佳方法是什么?不推荐使用,以便用户在调用该方法时注意到它?理想情况下,我想要一个
DeprecationWarning
被触发。
最佳答案
好的,这是我的工作示例。我实际上想不出用 Python C 类型调用导入的 python 函数,所以我直接去了 C API,无论如何它应该会更好
struct Foobar {
Foobar() {}
void foo(int32_t art) {}
};
PYBIND11_MODULE(example, m) {
pybind11::class_<Foobar>(m, "PyFoobar")
.def(py::init<>())
.def("old_foo",
[](pybind11::object &self, int arg_to_foo)
{
PyErr_WarnEx(PyExc_DeprecationWarning,
"old_foo() is deprecated, use new_foo() instead.",
1);
return self.attr("new_foo")(arg_to_foo);
})
.def("new_foo", &Foobar::foo);
}
您可以将此处的任何警告类型作为第一个参数传递:
import example
import warnings
warnings.simplefilter("default")
def mary():
f = example.PyFoobar()
f.old_foo(1)
mary()
如果将堆栈级别设置为
1
你会得到
test.py:9: DeprecationWarning: old_foo() is deprecated, use new_foo() instead.
f.old_foo(1)
您可能想要
2
这将为您提供实际的调用上下文,但取决于您的用例是什么
test.py:11: DeprecationWarning: old_foo() is deprecated, use new_foo() instead.
mary()
还需要注意的是,默认情况下,许多版本的 python 都关闭了弃用警告。您可以通过检查
warnings.filters
.这就是为什么在我的示例中我调用了
warnings.simplefilter("default")
它启用所有类型的警告,但仅在第一次被击中时。还有其他方法可以控制它,包括使用
-W
运行 python 或环境变量时的标志。
关于python - 将 pybind11 绑定(bind)标记为已弃用的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62465062/
我是一名优秀的程序员,十分优秀!