From e340e852e87a45c60de09d0c7fd19872a01218bf Mon Sep 17 00:00:00 2001 From: Kwabena Amponsah Date: Tue, 26 Nov 2024 09:49:31 +0000 Subject: [PATCH 1/2] #20 Cast int or float in numeric default args --- cppwg/utils/utils.py | 6 ++++-- cppwg/writers/constructor_writer.py | 6 +++--- cppwg/writers/free_function_writer.py | 14 +++++++------- cppwg/writers/method_writer.py | 6 +++--- 4 files changed, 17 insertions(+), 15 deletions(-) diff --git a/cppwg/utils/utils.py b/cppwg/utils/utils.py index bdd38d7..4232a6a 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..6fa47a4 100644 --- a/cppwg/writers/constructor_writer.py +++ b/cppwg/writers/constructor_writer.py @@ -188,9 +188,9 @@ 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..5c77bb9 100644 --- a/cppwg/writers/free_function_writer.py +++ b/cppwg/writers/free_function_writer.py @@ -49,14 +49,14 @@ 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..c91cf68 100644 --- a/cppwg/writers/method_writer.py +++ b/cppwg/writers/method_writer.py @@ -158,9 +158,9 @@ 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: From 60f0e3b772e1efbe955ef213563f39bccd43f746 Mon Sep 17 00:00:00 2001 From: Kwabena Amponsah Date: Tue, 26 Nov 2024 09:53:06 +0000 Subject: [PATCH 2/2] #20 Fix code style --- cppwg/utils/utils.py | 2 +- cppwg/writers/constructor_writer.py | 4 +++- cppwg/writers/free_function_writer.py | 4 +++- cppwg/writers/method_writer.py | 4 +++- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/cppwg/utils/utils.py b/cppwg/utils/utils.py index 4232a6a..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, integer:bool = False) -> Number: +def str_to_num(expr: str, integer: bool = False) -> Number: """ Convert a literal string expression to a number e.g. "(-1)" to -1. diff --git a/cppwg/writers/constructor_writer.py b/cppwg/writers/constructor_writer.py index 6fa47a4..e1cb032 100644 --- a/cppwg/writers/constructor_writer.py +++ b/cppwg/writers/constructor_writer.py @@ -188,7 +188,9 @@ def generate_wrapper(self) -> str: ): # Try to convert "(-1)" to "-1" etc. default_value = str(arg.default_value) - value = utils.str_to_num(default_value, integer="int" in str(arg.decl_type)) + value = utils.str_to_num( + default_value, integer="int" in str(arg.decl_type) + ) if value is not None: default_value = str(value) diff --git a/cppwg/writers/free_function_writer.py b/cppwg/writers/free_function_writer.py index 5c77bb9..1681110 100644 --- a/cppwg/writers/free_function_writer.py +++ b/cppwg/writers/free_function_writer.py @@ -54,7 +54,9 @@ def generate_wrapper(self) -> str: if arg.default_value is not None: # Try to convert "(-1)" to "-1" etc. default_value = str(arg.default_value) - value = utils.str_to_num(default_value, integer="int" in str(arg.decl_type)) + 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}" diff --git a/cppwg/writers/method_writer.py b/cppwg/writers/method_writer.py index c91cf68..07cd99b 100644 --- a/cppwg/writers/method_writer.py +++ b/cppwg/writers/method_writer.py @@ -158,7 +158,9 @@ def generate_wrapper(self) -> str: ): # Try to convert "(-1)" to "-1" etc. default_value = str(arg.default_value) - value = utils.str_to_num(default_value, integer="int" in str(arg.decl_type)) + value = utils.str_to_num( + default_value, integer="int" in str(arg.decl_type) + ) if value is not None: default_value = str(value)