Merge pull request #22955 from VadimLevin:dev/vlevin/handle-properties-with-keyword-names
fix: add _ suffix to properties having reserved keyword names
This commit is contained in:
commit
aff375808d
@ -213,6 +213,17 @@ AsyncArray testAsyncException()
|
|||||||
return p.getArrayResult();
|
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 {
|
namespace nested {
|
||||||
CV_WRAP static inline bool testEchoBooleanFunction(bool flag) {
|
CV_WRAP static inline bool testEchoBooleanFunction(bool flag) {
|
||||||
return flag;
|
return flag;
|
||||||
|
|||||||
@ -169,10 +169,10 @@ static int pyopencv_${name}_set_${member}(pyopencv_${name}_t* p, PyObject *value
|
|||||||
|
|
||||||
|
|
||||||
gen_template_prop_init = Template("""
|
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("""
|
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("""
|
gen_template_overloaded_function_call = Template("""
|
||||||
{
|
{
|
||||||
@ -242,6 +242,13 @@ class ClassProp(object):
|
|||||||
if "/RW" in decl[3]:
|
if "/RW" in decl[3]:
|
||||||
self.readonly = False
|
self.readonly = False
|
||||||
|
|
||||||
|
@property
|
||||||
|
def export_name(self):
|
||||||
|
if self.name in python_reserved_keywords:
|
||||||
|
return self.name + "_"
|
||||||
|
return self.name
|
||||||
|
|
||||||
|
|
||||||
class ClassInfo(object):
|
class ClassInfo(object):
|
||||||
def __init__(self, name, decl=None, codegen=None):
|
def __init__(self, name, decl=None, codegen=None):
|
||||||
# Scope name can be a module or other class e.g. cv::SimpleBlobDetector::Params
|
# Scope name can be a module or other class e.g. cv::SimpleBlobDetector::Params
|
||||||
@ -357,13 +364,13 @@ class ClassInfo(object):
|
|||||||
else:
|
else:
|
||||||
getset_code.write(gen_template_get_prop.substitute(name=self.name, member=pname, membertype=p.tp, access=access_op))
|
getset_code.write(gen_template_get_prop.substitute(name=self.name, member=pname, membertype=p.tp, access=access_op))
|
||||||
if p.readonly:
|
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:
|
else:
|
||||||
if self.isalgorithm:
|
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))
|
getset_code.write(gen_template_set_prop_algo.substitute(name=self.name, cname=self.cname, member=pname, membertype=p.tp, access=access_op))
|
||||||
else:
|
else:
|
||||||
getset_code.write(gen_template_set_prop.substitute(name=self.name, member=pname, membertype=p.tp, access=access_op))
|
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_code = StringIO()
|
||||||
methods_inits = StringIO()
|
methods_inits = StringIO()
|
||||||
|
|||||||
@ -119,6 +119,23 @@ class Bindings(NewOpenCVTests):
|
|||||||
test_overload_resolution('rect with float coordinates', (4.5, 4, 2, 1))
|
test_overload_resolution('rect with float coordinates', (4.5, 4, 2, 1))
|
||||||
test_overload_resolution('rect with wrong number of coordinates', (4, 4, 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):
|
class Arguments(NewOpenCVTests):
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user