From 3f5f09e730fef41e4f3c3b2dc059f6324d342c86 Mon Sep 17 00:00:00 2001 From: Vadim Levin Date: Tue, 13 Dec 2022 20:24:57 +0300 Subject: [PATCH] fix: add _ suffix to properties having reserved keyword names --- .../include/opencv2/core/bindings_utils.hpp | 11 +++++++++++ modules/python/src2/gen2.py | 15 +++++++++++---- modules/python/test/test_misc.py | 17 +++++++++++++++++ 3 files changed, 39 insertions(+), 4 deletions(-) diff --git a/modules/core/include/opencv2/core/bindings_utils.hpp b/modules/core/include/opencv2/core/bindings_utils.hpp index 6e825ec816..5de2f7022e 100644 --- a/modules/core/include/opencv2/core/bindings_utils.hpp +++ b/modules/core/include/opencv2/core/bindings_utils.hpp @@ -213,6 +213,17 @@ AsyncArray testAsyncException() return p.getArrayResult(); } +struct CV_EXPORTS_W_SIMPLE ClassWithKeywordProperties { + CV_PROP_RW int lambda; + CV_PROP int except; + + CV_WRAP explicit ClassWithKeywordProperties(int lambda_arg = 24, int except_arg = 42) + { + lambda = lambda_arg; + except = except_arg; + } +}; + namespace nested { CV_WRAP static inline bool testEchoBooleanFunction(bool flag) { return flag; diff --git a/modules/python/src2/gen2.py b/modules/python/src2/gen2.py index 1a9239c07f..14508761fb 100755 --- a/modules/python/src2/gen2.py +++ b/modules/python/src2/gen2.py @@ -169,10 +169,10 @@ static int pyopencv_${name}_set_${member}(pyopencv_${name}_t* p, PyObject *value gen_template_prop_init = Template(""" - {(char*)"${member}", (getter)pyopencv_${name}_get_${member}, NULL, (char*)"${member}", NULL},""") + {(char*)"${export_member_name}", (getter)pyopencv_${name}_get_${member}, NULL, (char*)"${export_member_name}", NULL},""") gen_template_rw_prop_init = Template(""" - {(char*)"${member}", (getter)pyopencv_${name}_get_${member}, (setter)pyopencv_${name}_set_${member}, (char*)"${member}", NULL},""") + {(char*)"${export_member_name}", (getter)pyopencv_${name}_get_${member}, (setter)pyopencv_${name}_set_${member}, (char*)"${export_member_name}", NULL},""") gen_template_overloaded_function_call = Template(""" { @@ -242,6 +242,13 @@ class ClassProp(object): if "/RW" in decl[3]: self.readonly = False + @property + def export_name(self): + if self.name in python_reserved_keywords: + return self.name + "_" + return self.name + + class ClassInfo(object): def __init__(self, name, decl=None, codegen=None): # Scope name can be a module or other class e.g. cv::SimpleBlobDetector::Params @@ -357,13 +364,13 @@ class ClassInfo(object): else: getset_code.write(gen_template_get_prop.substitute(name=self.name, member=pname, membertype=p.tp, access=access_op)) if p.readonly: - getset_inits.write(gen_template_prop_init.substitute(name=self.name, member=pname)) + getset_inits.write(gen_template_prop_init.substitute(name=self.name, member=pname, export_member_name=p.export_name)) else: if self.isalgorithm: getset_code.write(gen_template_set_prop_algo.substitute(name=self.name, cname=self.cname, member=pname, membertype=p.tp, access=access_op)) else: getset_code.write(gen_template_set_prop.substitute(name=self.name, member=pname, membertype=p.tp, access=access_op)) - getset_inits.write(gen_template_rw_prop_init.substitute(name=self.name, member=pname)) + getset_inits.write(gen_template_rw_prop_init.substitute(name=self.name, member=pname, export_member_name=p.export_name)) methods_code = StringIO() methods_inits = StringIO() diff --git a/modules/python/test/test_misc.py b/modules/python/test/test_misc.py index ec56585ace..71e7f41bb5 100644 --- a/modules/python/test/test_misc.py +++ b/modules/python/test/test_misc.py @@ -119,6 +119,23 @@ class Bindings(NewOpenCVTests): test_overload_resolution('rect with float coordinates', (4.5, 4, 2, 1)) test_overload_resolution('rect with wrong number of coordinates', (4, 4, 1)) + def test_properties_with_reserved_keywords_names_are_transformed(self): + obj = cv.utils.ClassWithKeywordProperties(except_arg=23) + self.assertTrue(hasattr(obj, "lambda_"), + msg="Class doesn't have RW property with converted name") + try: + obj.lambda_ = 32 + except Exception as e: + self.fail("Failed to set value to RW property. Error: {}".format(e)) + + self.assertTrue(hasattr(obj, "except_"), + msg="Class doesn't have readonly property with converted name") + self.assertEqual(obj.except_, 23, + msg="Can't access readonly property value") + with self.assertRaises(AttributeError): + obj.except_ = 32 + + class Arguments(NewOpenCVTests):