Skip to content

Commit

Permalink
PyCLIF callback_test.py: Add testPassNoneAsCallback
Browse files Browse the repository at this point in the history
This CL was used in a PyCLIF-pybind11 TGP (cl/667456010, 2024-08-26):

http://tap/OCL:667456010:BASE:667610796:1724689781533:d2626456:

```
    571 Failing Targets
    147 Broken Targets
```

For this to work, a pybind11clif fix is needed (merged already):

* google/pybind11clif#30155

See also: https://b.corp.google.com/issues/287289622#comment75

PiperOrigin-RevId: 668995414
  • Loading branch information
rwgk committed Sep 6, 2024
1 parent 3af2676 commit 5c68484
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 12 deletions.
32 changes: 20 additions & 12 deletions clif/pybind11/function_lib.py
Original file line number Diff line number Diff line change
Expand Up @@ -402,47 +402,55 @@ def generate_py_args(func_decl: ast_pb2.FuncDecl,
return ', '.join(params_list)


def _get_noconvert(param: ast_pb2.ParamDecl):
if param.type.HasField('callable'):
return '.noconvert()'
return ''


def _generate_py_arg_with_default(
param: ast_pb2.ParamDecl, return_value_policy_pack: str
) -> str:
"""Generate `pybind11::arg` for parameters with default value."""
noconvert = _get_noconvert(param)
if return_value_policy_pack:
if param.default_value == 'nullptr':
return (
f'pybind11::arg("{param.name.cpp_name}")'
f'.policies({return_value_policy_pack}) = {param.default_value}'
f'pybind11::arg("{param.name.cpp_name}"){noconvert}'
f'.policies({return_value_policy_pack}) = '
f'{param.default_value}'
)
else:
return (
f'pybind11::arg("{param.name.cpp_name}")'
f'pybind11::arg("{param.name.cpp_name}"){noconvert}'
f'.policies({return_value_policy_pack}) = '
f'static_cast<{param.type.cpp_type}>({param.default_value})'
)
else:
if param.default_value == 'nullptr':
if param.type.cpp_type == _CPP_TYPE_PYOBJECT_PTR_FROM_MATCHER:
return (
f'pybind11::arg("{param.name.cpp_name}") ='
' pybind11::nullptr_default_arg()'
f'pybind11::arg("{param.name.cpp_name}"){noconvert} = '
'pybind11::nullptr_default_arg()'
)
return f'pybind11::arg("{param.name.cpp_name}") = {param.default_value}'
return (f'pybind11::arg("{param.name.cpp_name}"){noconvert} = '
f'{param.default_value}')
else:
return (
f'pybind11::arg("{param.name.cpp_name}") = '
f'pybind11::arg("{param.name.cpp_name}"){noconvert} = '
f'static_cast<{param.type.cpp_type}>({param.default_value})'
)


def _generate_py_arg_without_default(
param: ast_pb2.ParamDecl, return_value_policy_pack: str
) -> str:
noconvert = _get_noconvert(param)
if return_value_policy_pack:
return (
f'pybind11::arg("{param.name.cpp_name}")'
f'.policies({return_value_policy_pack})'
)
return (f'pybind11::arg("{param.name.cpp_name}"){noconvert}'
f'.policies({return_value_policy_pack})')
else:
return f'pybind11::arg("{param.name.cpp_name}")'
return f'pybind11::arg("{param.name.cpp_name}{noconvert}")'


def _generate_return_value_policy_pack_for_py_arg(
Expand Down
4 changes: 4 additions & 0 deletions clif/testing/python/callback_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,10 @@ def testBytesCallback(self):
self.assertIsInstance(res, bytes)
self.assertEqual(res, b'abcd')

def testPassNoneAsCallback(self):
with self.assertRaises(TypeError):
callback.LambdaCallback(None)

def testPyObjectCallback(self):
res = callback.PyObjectCallback(StringCallback)
self.assertIsInstance(res, str)
Expand Down

0 comments on commit 5c68484

Please sign in to comment.