gemini-code-assist[bot] commented on code in PR #448:
URL: https://github.com/apache/tvm-ffi/pull/448#discussion_r2808112498


##########
tests/python/test_function.py:
##########
@@ -153,6 +153,15 @@ def fapply(f: Any, *args: Any) -> Any:
     assert fapply(add, 1, 3.3) == 4.3
 
 
+def test_pyfunc_init() -> None:
+    def add(a: int, b: int) -> int:
+        return a + b
+
+    fadd = tvm_ffi.Function(add)
+    assert isinstance(fadd, tvm_ffi.Function)
+    assert fadd(1, 2) == 3

Review Comment:
   ![medium](https://www.gstatic.com/codereviewagent/medium-priority.svg)
   
   The test for `tvm_ffi.Function.__init__` is a good start, but it only covers 
creating a `Function` from a new Python callable. To ensure the new constructor 
is fully tested, please consider adding test cases for:
   
   1.  Creating a `Function` from an existing `tvm_ffi.Function` instance.
   2.  Verifying that creating a `Function` from a non-callable object 
correctly raises a `TypeError`.
   
   ```suggestion
       # Test creating from a Python callable
       fadd = tvm_ffi.Function(add)
       assert isinstance(fadd, tvm_ffi.Function)
       assert fadd(1, 2) == 3
   
       # Test creating from an existing tvm_ffi.Function
       fadd2 = tvm_ffi.Function(fadd)
       assert isinstance(fadd2, tvm_ffi.Function)
       assert fadd2(3, 4) == 7
       assert fadd.same_as(fadd2)
   
       # Test creating from a non-callable raises TypeError
       with pytest.raises(TypeError):
           tvm_ffi.Function(123)
   ```



##########
python/tvm_ffi/cython/function.pxi:
##########
@@ -889,6 +889,27 @@ cdef class Function(Object):
     def __cinit__(self) -> None:
         self.c_release_gil = _RELEASE_GIL_BY_DEFAULT
 
+    def __init__(self, func: Callable[..., Any]) -> None:
+        """Initialize a Function from a Python callable.
+
+        This constructor allows creating a `tvm_ffi.Function` directly
+        from a Python function or another `tvm_ffi.Function` instance.
+
+        Parameters
+        ----------
+        func : Callable[..., Any]
+            The Python callable to wrap.
+        """
+        cdef TVMFFIObjectHandle chandle = NULL
+        if not callable(func):
+            raise TypeError(f"func must be callable, got {type(func)}")
+        if isinstance(func, Function):
+            chandle = (<Object>func).chandle
+            TVMFFIObjectIncRef(chandle)
+        else:
+            _convert_to_ffi_func_handle(func, &chandle)

Review Comment:
   ![medium](https://www.gstatic.com/codereviewagent/medium-priority.svg)
   
   The logic for handling different types of `func` can be restructured for 
better clarity and a minor efficiency gain. Since `isinstance(func, Function)` 
is a more specific check than `callable(func)`, it's better to check for it 
first. Using a single `if/elif/else` block makes the different cases clearer.
   
   ```
           if isinstance(func, Function):
               chandle = (<Object>func).chandle
               TVMFFIObjectIncRef(chandle)
           elif callable(func):
               _convert_to_ffi_func_handle(func, &chandle)
           else:
               raise TypeError(f"func must be callable, got {type(func)}")
   ```



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to