diff --git a/cppwg/utils/utils.py b/cppwg/utils/utils.py index bdd38d7..1a6e379 100644 --- a/cppwg/utils/utils.py +++ b/cppwg/utils/utils.py @@ -172,7 +172,7 @@ def read_source_file( return source -def str_to_num(expr: str) -> float: +def str_to_num(expr: str, integer: bool = False) -> Number: """ Convert a literal string expression to a number e.g. "(-1)" to -1. @@ -183,12 +183,14 @@ def str_to_num(expr: str) -> float: Returns ------- - float + Number The converted number, or None if the conversion fails """ try: result = ast.literal_eval(expr.strip()) if isinstance(result, Number): + if integer: + return int(result) return float(result) except (SyntaxError, TypeError, ValueError): pass diff --git a/cppwg/writers/constructor_writer.py b/cppwg/writers/constructor_writer.py index 624cf6f..e1cb032 100644 --- a/cppwg/writers/constructor_writer.py +++ b/cppwg/writers/constructor_writer.py @@ -188,9 +188,11 @@ def generate_wrapper(self) -> str: ): # Try to convert "(-1)" to "-1" etc. default_value = str(arg.default_value) - num = utils.str_to_num(default_value) - if num is not None: - default_value = str(num) + value = utils.str_to_num( + default_value, integer="int" in str(arg.decl_type) + ) + if value is not None: + default_value = str(value) # Check for template params in default value if self.template_params: diff --git a/cppwg/writers/free_function_writer.py b/cppwg/writers/free_function_writer.py index 39215f1..1681110 100644 --- a/cppwg/writers/free_function_writer.py +++ b/cppwg/writers/free_function_writer.py @@ -49,14 +49,16 @@ def generate_wrapper(self) -> str: # e.g. with default values: ', py::arg("foo") = 1, py::arg("bar") = 2' default_args = "" if not self.free_function_info.hierarchy_attribute("exclude_default_args"): - for argument in self.free_function_info.decls[0].arguments: - default_args += f', py::arg("{argument.name}")' - if argument.default_value is not None: + for arg in self.free_function_info.decls[0].arguments: + default_args += f', py::arg("{arg.name}")' + if arg.default_value is not None: # Try to convert "(-1)" to "-1" etc. - default_value = str(argument.default_value) - num = utils.str_to_num(default_value) - if num is not None: - default_value = str(num) + default_value = str(arg.default_value) + value = utils.str_to_num( + default_value, integer="int" in str(arg.decl_type) + ) + if value is not None: + default_value = str(value) default_args += f" = {default_value}" # Add the free function wrapper code to the wrapper string diff --git a/cppwg/writers/method_writer.py b/cppwg/writers/method_writer.py index 4ccc056..07cd99b 100644 --- a/cppwg/writers/method_writer.py +++ b/cppwg/writers/method_writer.py @@ -158,9 +158,11 @@ def generate_wrapper(self) -> str: ): # Try to convert "(-1)" to "-1" etc. default_value = str(arg.default_value) - num = utils.str_to_num(default_value) - if num is not None: - default_value = str(num) + value = utils.str_to_num( + default_value, integer="int" in str(arg.decl_type) + ) + if value is not None: + default_value = str(value) # Check for template params in default value if self.template_params: