This is an automated email from the ASF dual-hosted git repository.

skrawcz pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/hamilton.git

commit 1571ad8b9062aadfbecc58b2a4b3ff8006172372
Author: Charles Swartz <[email protected]>
AuthorDate: Mon Apr 7 21:35:12 2025 -0400

    Move error handling to `_process_unpack_fields`
---
 hamilton/function_modifiers/expanders.py | 27 ++++++++++++---------------
 1 file changed, 12 insertions(+), 15 deletions(-)

diff --git a/hamilton/function_modifiers/expanders.py 
b/hamilton/function_modifiers/expanders.py
index 3021ee40..31d1f8c3 100644
--- a/hamilton/function_modifiers/expanders.py
+++ b/hamilton/function_modifiers/expanders.py
@@ -3,7 +3,7 @@ import dataclasses
 import functools
 import inspect
 import typing
-from typing import Any, Callable, Collection, Dict, List, Optional, Tuple, 
Type, Union
+from typing import Any, Callable, Collection, Dict, List, Tuple, Type, Union
 
 import typing_extensions
 import typing_inspect
@@ -874,7 +874,7 @@ class extract_fields(base.SingleNodeNodeTransformer):
         return output_nodes
 
 
-def _process_unpack_fields(fields: List[str], output_type: Any) -> 
Optional[List[Type]]:
+def _process_unpack_fields(fields: List[str], output_type: Any) -> List[Type]:
     """Processes the fields and base output type to extract a tuple of field 
types.
 
     :param fields: List of fields to extract from the tuple.
@@ -882,9 +882,15 @@ def _process_unpack_fields(fields: List[str], output_type: 
Any) -> Optional[List
     :return: List of field types.
     """
 
-    base_type = typing_inspect.get_origin(output_type)
+    base_type = typing_inspect.get_origin(output_type)  # Returns None when 
output_type is None
     if base_type != tuple and base_type != Tuple:
-        return
+        message = (
+            f"For unpacking fields, the decorated function output type must be 
either an "
+            f"explicit length tuple (e.g.`tuple[int, str]`, `typing.Tuple[int, 
str]`) or an "
+            f"indeterminate length tuple (e.g. `tuple[int, ...]`, 
`typing.Tuple[int, ...]`), "
+            f"not: {output_type}"
+        )
+        raise base.InvalidDecoratorException(message)
 
     output_args = typing_inspect.get_args(output_type)
     num_ellipsis = output_args.count(Ellipsis)
@@ -953,17 +959,8 @@ class unpack_fields(base.SingleNodeNodeTransformer):
     def validate(self, fn: Callable):
         output_type = typing.get_type_hints(fn).get("return")
         field_types = _process_unpack_fields(self.fields, output_type)
-        if field_types:
-            self.field_types = field_types
-            self.output_type = output_type
-        else:
-            message = (
-                f"For unpacking fields, the decorated function output type 
must be either an "
-                f"explicit length tuple (e.g.`tuple[int, str]`, 
`typing.Tuple[int, str]`) or an "
-                f"indeterminate length tuple (e.g. `tuple[int, ...]`, 
`typing.Tuple[int, ...]`), "
-                f"not: {output_type}"
-            )
-            raise base.InvalidDecoratorException(message)
+        self.field_types = field_types
+        self.output_type = output_type
 
     @override
     def transform_node(

Reply via email to