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("""
{
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
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()
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):