[PyOV] Added deprecation function (#12540)
This commit is contained in:
parent
836765874e
commit
27c1c6a3d1
@ -4,6 +4,8 @@
|
|||||||
|
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
from functools import wraps
|
||||||
|
from typing import Callable, Any
|
||||||
|
|
||||||
|
|
||||||
def add_openvino_libs_to_path() -> None:
|
def add_openvino_libs_to_path() -> None:
|
||||||
@ -28,3 +30,20 @@ def add_openvino_libs_to_path() -> None:
|
|||||||
# On Windows, with Python >= 3.8, DLLs are no longer imported from the PATH.
|
# On Windows, with Python >= 3.8, DLLs are no longer imported from the PATH.
|
||||||
if (3, 8) <= sys.version_info:
|
if (3, 8) <= sys.version_info:
|
||||||
os.add_dll_directory(os.path.abspath(lib_path))
|
os.add_dll_directory(os.path.abspath(lib_path))
|
||||||
|
|
||||||
|
|
||||||
|
def deprecated(version: str = "", message: str = "") -> Callable[..., Any]:
|
||||||
|
"""Prints deprecation warning "{function_name} is deprecated and will be removed in version {version}. {message}" and runs the function.
|
||||||
|
|
||||||
|
:param version: The version in which the code will be removed.
|
||||||
|
:param message: A message explaining why the function is deprecated and/or what to use instead.
|
||||||
|
"""
|
||||||
|
def decorator(wrapped: Callable[..., Any]) -> Callable[..., Any]:
|
||||||
|
@wraps(wrapped)
|
||||||
|
def wrapper(*args: Any, **kwargs: Any) -> Callable[..., Any]:
|
||||||
|
# it must be imported here; otherwise, there are errors with no loaded DLL for Windows
|
||||||
|
from openvino.pyopenvino.util import deprecation_warning
|
||||||
|
deprecation_warning(wrapped.__name__, version, message)
|
||||||
|
return wrapped(*args, **kwargs)
|
||||||
|
return wrapper
|
||||||
|
return decorator
|
||||||
|
@ -5,15 +5,14 @@
|
|||||||
#include "openvino/pass/manager.hpp"
|
#include "openvino/pass/manager.hpp"
|
||||||
|
|
||||||
#include <pybind11/pybind11.h>
|
#include <pybind11/pybind11.h>
|
||||||
#include <pybind11/stl.h>
|
|
||||||
|
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
#include "openvino/pass/constant_folding.hpp"
|
#include "openvino/pass/constant_folding.hpp"
|
||||||
#include "openvino/pass/pass.hpp"
|
#include "openvino/pass/pass.hpp"
|
||||||
#include "openvino/pass/serialize.hpp"
|
#include "openvino/pass/serialize.hpp"
|
||||||
#include "openvino/pass/validate.hpp"
|
|
||||||
#include "pyopenvino/graph/passes/manager.hpp"
|
#include "pyopenvino/graph/passes/manager.hpp"
|
||||||
|
#include "pyopenvino/utils/utils.hpp"
|
||||||
|
|
||||||
namespace py = pybind11;
|
namespace py = pybind11;
|
||||||
|
|
||||||
@ -69,10 +68,9 @@ void regclass_passes_Manager(py::module m) {
|
|||||||
manager.def(
|
manager.def(
|
||||||
"register_pass",
|
"register_pass",
|
||||||
[](ov::pass::Manager& self, const std::string& pass_name) -> void {
|
[](ov::pass::Manager& self, const std::string& pass_name) -> void {
|
||||||
PyErr_WarnEx(PyExc_DeprecationWarning,
|
Common::utils::deprecation_warning("register_pass(pass_name)",
|
||||||
"register_pass with this arguments is deprecated! "
|
"",
|
||||||
"Please use register_pass(ConstantFolding()) instead.",
|
"Please use register_pass(ConstantFolding()) instead.");
|
||||||
1);
|
|
||||||
if (pass_name == "ConstantFolding") {
|
if (pass_name == "ConstantFolding") {
|
||||||
self.register_pass<ov::pass::ConstantFolding>();
|
self.register_pass<ov::pass::ConstantFolding>();
|
||||||
}
|
}
|
||||||
@ -93,10 +91,9 @@ void regclass_passes_Manager(py::module m) {
|
|||||||
const std::string& pass_name,
|
const std::string& pass_name,
|
||||||
const FilePaths& file_paths,
|
const FilePaths& file_paths,
|
||||||
const std::string& version) -> void {
|
const std::string& version) -> void {
|
||||||
PyErr_WarnEx(PyExc_DeprecationWarning,
|
Common::utils::deprecation_warning("register_pass(pass_name, output_files, version)",
|
||||||
"register_pass with this arguments is deprecated! "
|
"",
|
||||||
"Please use register_pass(Serialize(xml, bin, version)) instead.",
|
"Please use register_pass(Serialize(xml, bin, version)) instead.");
|
||||||
1);
|
|
||||||
if (pass_name == "Serialize") {
|
if (pass_name == "Serialize") {
|
||||||
self.register_pass<ov::pass::Serialize>(file_paths.first,
|
self.register_pass<ov::pass::Serialize>(file_paths.first,
|
||||||
file_paths.second,
|
file_paths.second,
|
||||||
@ -139,10 +136,9 @@ void regclass_passes_Manager(py::module m) {
|
|||||||
const std::string& xml_path,
|
const std::string& xml_path,
|
||||||
const std::string& bin_path,
|
const std::string& bin_path,
|
||||||
const std::string& version) -> void {
|
const std::string& version) -> void {
|
||||||
PyErr_WarnEx(PyExc_DeprecationWarning,
|
Common::utils::deprecation_warning("register_pass(pass_name, xml_path, bin_path, version",
|
||||||
"register_pass with this arguments is deprecated! "
|
"",
|
||||||
"Please use register_pass(Serialize(xml, bin, version)) instead.",
|
"Please use register_pass(Serialize(xml, bin, version)) instead.");
|
||||||
1);
|
|
||||||
if (pass_name == "Serialize") {
|
if (pass_name == "Serialize") {
|
||||||
self.register_pass<ov::pass::Serialize>(xml_path, bin_path, convert_to_version(version));
|
self.register_pass<ov::pass::Serialize>(xml_path, bin_path, convert_to_version(version));
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
#include "openvino/core/graph_util.hpp"
|
#include "openvino/core/graph_util.hpp"
|
||||||
#include "openvino/core/validation_util.hpp"
|
#include "openvino/core/validation_util.hpp"
|
||||||
#include "openvino/pass/manager.hpp"
|
#include "openvino/pass/manager.hpp"
|
||||||
|
#include "pyopenvino/utils/utils.hpp"
|
||||||
|
|
||||||
namespace py = pybind11;
|
namespace py = pybind11;
|
||||||
|
|
||||||
@ -70,4 +71,20 @@ void regmodule_graph_util(py::module m) {
|
|||||||
py::arg("target"),
|
py::arg("target"),
|
||||||
py::arg("replacement"),
|
py::arg("replacement"),
|
||||||
py::arg("outputs_order"));
|
py::arg("outputs_order"));
|
||||||
|
|
||||||
|
mod.def(
|
||||||
|
"deprecation_warning",
|
||||||
|
[](const std::string& function_name, const std::string& version, const std::string& message) {
|
||||||
|
Common::utils::deprecation_warning(function_name, version, message);
|
||||||
|
},
|
||||||
|
py::arg("function_name"),
|
||||||
|
py::arg("version") = "",
|
||||||
|
py::arg("message") = "",
|
||||||
|
R"(
|
||||||
|
Prints deprecation warning "{function_name} is deprecated and will be removed in version {version}. {message}".
|
||||||
|
|
||||||
|
:param function_name: The name of the deprecated function.
|
||||||
|
:param version: The version in which the code will be removed.
|
||||||
|
:param message: A message explaining why the function is deprecated.
|
||||||
|
)");
|
||||||
}
|
}
|
||||||
|
@ -136,5 +136,17 @@ std::string convert_path_to_string(const py::object& path) {
|
|||||||
"Examples:\n(1) '/home/user/models/model.onnx'\n(2) Path('/home/user/models/model/model.onnx')";
|
"Examples:\n(1) '/home/user/models/model.onnx'\n(2) Path('/home/user/models/model/model.onnx')";
|
||||||
throw ov::Exception(str.str());
|
throw ov::Exception(str.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void deprecation_warning(const std::string& function_name, const std::string& version, const std::string& message) {
|
||||||
|
std::stringstream ss;
|
||||||
|
ss << function_name << " is deprecated";
|
||||||
|
if (!version.empty()) {
|
||||||
|
ss << " and will be removed in version " << version;
|
||||||
|
}
|
||||||
|
if (!message.empty()) {
|
||||||
|
ss << ". " << message;
|
||||||
|
}
|
||||||
|
PyErr_WarnEx(PyExc_DeprecationWarning, ss.str().data(), 2);
|
||||||
|
}
|
||||||
}; // namespace utils
|
}; // namespace utils
|
||||||
}; // namespace Common
|
}; // namespace Common
|
||||||
|
@ -18,6 +18,8 @@ namespace utils {
|
|||||||
std::map<std::string, ov::Any> properties_to_any_map(const std::map<std::string, py::object>& properties);
|
std::map<std::string, ov::Any> properties_to_any_map(const std::map<std::string, py::object>& properties);
|
||||||
|
|
||||||
std::string convert_path_to_string(const py::object& path);
|
std::string convert_path_to_string(const py::object& path);
|
||||||
|
|
||||||
|
void deprecation_warning(const std::string& function_name, const std::string& version = std::string(), const std::string& message = std::string());
|
||||||
}; // namespace utils
|
}; // namespace utils
|
||||||
}; // namespace Common
|
}; // namespace Common
|
||||||
|
|
||||||
|
@ -4,6 +4,8 @@
|
|||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import openvino.runtime as ov
|
import openvino.runtime as ov
|
||||||
|
import pytest
|
||||||
|
from openvino.pyopenvino.util import deprecation_warning
|
||||||
from openvino.runtime import Shape
|
from openvino.runtime import Shape
|
||||||
|
|
||||||
|
|
||||||
@ -27,3 +29,14 @@ def test_get_constant_from_source_failed():
|
|||||||
folded_const = ov.utils.get_constant_from_source(reshape.input(1).get_source_output())
|
folded_const = ov.utils.get_constant_from_source(reshape.input(1).get_source_output())
|
||||||
|
|
||||||
assert folded_const is None
|
assert folded_const is None
|
||||||
|
|
||||||
|
|
||||||
|
def test_deprecation_warning():
|
||||||
|
with pytest.warns(DeprecationWarning, match="function1 is deprecated"):
|
||||||
|
deprecation_warning("function1")
|
||||||
|
with pytest.warns(DeprecationWarning, match="function2 is deprecated and will be removed in version 2025.4"):
|
||||||
|
deprecation_warning("function2", "2025.4")
|
||||||
|
with pytest.warns(DeprecationWarning, match="function3 is deprecated. Use another function instead"):
|
||||||
|
deprecation_warning("function3", message="Use another function instead")
|
||||||
|
with pytest.warns(DeprecationWarning, match="function4 is deprecated and will be removed in version 2025.4. Use another function instead"):
|
||||||
|
deprecation_warning("function4", version="2025.4", message="Use another function instead")
|
||||||
|
@ -2,12 +2,15 @@
|
|||||||
# Copyright (C) 2018-2022 Intel Corporation
|
# Copyright (C) 2018-2022 Intel Corporation
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
from typing import Tuple, Union, List
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
import openvino
|
import openvino
|
||||||
|
import openvino.runtime.opset8 as ops
|
||||||
|
import pytest
|
||||||
from openvino.runtime import Model, Core, Shape, Type
|
from openvino.runtime import Model, Core, Shape, Type
|
||||||
from openvino.runtime.op import Parameter
|
from openvino.runtime.op import Parameter
|
||||||
import openvino.runtime.opset8 as ops
|
from openvino.utils import deprecated
|
||||||
from typing import Tuple, Union, List
|
|
||||||
import numpy as np
|
|
||||||
|
|
||||||
|
|
||||||
def get_test_model():
|
def get_test_model():
|
||||||
@ -49,3 +52,30 @@ def generate_add_model() -> openvino.pyopenvino.Model:
|
|||||||
param2 = ops.parameter(Shape([2, 1]), dtype=np.float32, name="data2")
|
param2 = ops.parameter(Shape([2, 1]), dtype=np.float32, name="data2")
|
||||||
add = ops.add(param1, param2)
|
add = ops.add(param1, param2)
|
||||||
return Model(add, [param1, param2], "TestFunction")
|
return Model(add, [param1, param2], "TestFunction")
|
||||||
|
|
||||||
|
|
||||||
|
def test_deprecation_decorator():
|
||||||
|
@deprecated()
|
||||||
|
def deprecated_function1(param1, param2=None):
|
||||||
|
pass
|
||||||
|
|
||||||
|
@deprecated(version="2025.4")
|
||||||
|
def deprecated_function2(param1=None):
|
||||||
|
pass
|
||||||
|
|
||||||
|
@deprecated(message="Use another function instead")
|
||||||
|
def deprecated_function3():
|
||||||
|
pass
|
||||||
|
|
||||||
|
@deprecated(version="2025.4", message="Use another function instead")
|
||||||
|
def deprecated_function4():
|
||||||
|
pass
|
||||||
|
|
||||||
|
with pytest.warns(DeprecationWarning, match="deprecated_function1 is deprecated"):
|
||||||
|
deprecated_function1("param1")
|
||||||
|
with pytest.warns(DeprecationWarning, match="deprecated_function2 is deprecated and will be removed in version 2025.4"):
|
||||||
|
deprecated_function2(param1=1)
|
||||||
|
with pytest.warns(DeprecationWarning, match="deprecated_function3 is deprecated. Use another function instead"):
|
||||||
|
deprecated_function3()
|
||||||
|
with pytest.warns(DeprecationWarning, match="deprecated_function4 is deprecated and will be removed in version 2025.4. Use another function instead"):
|
||||||
|
deprecated_function4()
|
||||||
|
Loading…
Reference in New Issue
Block a user