Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
P
pybind11_abseil
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
open
pybind11_abseil
Commits
1d53beb5
Commit
1d53beb5
authored
Feb 10, 2022
by
Xiaofei Wang
Committed by
Copybara-Service
Feb 10, 2022
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Internal change
PiperOrigin-RevId: 427870099
parent
d77d4f90
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
43 additions
and
1 deletions
+43
-1
pybind11_abseil/statusor_caster.h
+11
-1
pybind11_abseil/tests/status_example.cc
+18
-0
pybind11_abseil/tests/status_test.py
+14
-0
No files found.
pybind11_abseil/statusor_caster.h
View file @
1d53beb5
...
@@ -42,7 +42,17 @@ struct type_caster<absl::StatusOr<PayloadType>> {
...
@@ -42,7 +42,17 @@ struct type_caster<absl::StatusOr<PayloadType>> {
public
:
public
:
using
PayloadCaster
=
make_caster
<
PayloadType
>
;
using
PayloadCaster
=
make_caster
<
PayloadType
>
;
using
StatusCaster
=
make_caster
<
absl
::
Status
>
;
using
StatusCaster
=
make_caster
<
absl
::
Status
>
;
static
constexpr
auto
name
=
PayloadCaster
::
name
;
PYBIND11_TYPE_CASTER
(
absl
::
StatusOr
<
PayloadType
>
,
PayloadCaster
::
name
);
// We need this to support overriding virtual functions in Python. See the
// test cases for example.
bool
load
(
handle
/*src*/
,
bool
/*convert*/
)
{
// This will not be called as long as we do not call C++ functions that
// redirect virtual calls back to Python.
// TODO(wangxf): Implement the load function.
return
false
;
}
// Convert C++ -> Python.
// Convert C++ -> Python.
static
handle
cast
(
const
absl
::
StatusOr
<
PayloadType
>*
src
,
static
handle
cast
(
const
absl
::
StatusOr
<
PayloadType
>*
src
,
...
...
pybind11_abseil/tests/status_example.cc
View file @
1d53beb5
...
@@ -79,6 +79,20 @@ absl::StatusOr<std::unique_ptr<IntValue>> ReturnUniquePtrStatusOr(int value) {
...
@@ -79,6 +79,20 @@ absl::StatusOr<std::unique_ptr<IntValue>> ReturnUniquePtrStatusOr(int value) {
return
absl
::
make_unique
<
IntValue
>
(
value
);
return
absl
::
make_unique
<
IntValue
>
(
value
);
}
}
class
IntGetter
{
public
:
virtual
~
IntGetter
()
{
}
virtual
absl
::
StatusOr
<
int
>
Get
(
int
i
)
const
=
0
;
};
class
PyIntGetter
:
public
IntGetter
{
public
:
using
IntGetter
::
IntGetter
;
absl
::
StatusOr
<
int
>
Get
(
int
i
)
const
override
{
PYBIND11_OVERRIDE_PURE
(
absl
::
StatusOr
<
int
>
,
IntGetter
,
Get
,
i
);
}
};
PYBIND11_MODULE
(
status_example
,
m
)
{
PYBIND11_MODULE
(
status_example
,
m
)
{
auto
status_module
=
pybind11
::
google
::
ImportStatusModule
();
auto
status_module
=
pybind11
::
google
::
ImportStatusModule
();
m
.
attr
(
"StatusNotOk"
)
=
status_module
.
attr
(
"StatusNotOk"
);
m
.
attr
(
"StatusNotOk"
)
=
status_module
.
attr
(
"StatusNotOk"
);
...
@@ -135,6 +149,10 @@ PYBIND11_MODULE(status_example, m) {
...
@@ -135,6 +149,10 @@ PYBIND11_MODULE(status_example, m) {
new
absl
::
StatusOr
<
int
>
(
absl
::
InvalidArgumentError
(
"Uh oh!"
));
new
absl
::
StatusOr
<
int
>
(
absl
::
InvalidArgumentError
(
"Uh oh!"
));
return
ptr
;
return
ptr
;
});
});
class_
<
IntGetter
,
PyIntGetter
>
(
m
,
"IntGetter"
)
.
def
(
init
())
.
def
(
"Get"
,
&
IntGetter
::
Get
);
}
}
}
// namespace test
}
// namespace test
...
...
pybind11_abseil/tests/status_test.py
View file @
1d53beb5
...
@@ -127,6 +127,14 @@ class StatusTest(absltest.TestCase):
...
@@ -127,6 +127,14 @@ class StatusTest(absltest.TestCase):
self
.
assertEqual
(
str
(
test_status
),
'ABORTED: test'
)
self
.
assertEqual
(
str
(
test_status
),
'ABORTED: test'
)
class
IntGetter
(
status_example
.
IntGetter
):
def
Get
(
self
,
i
):
if
i
>
10
:
raise
ValueError
(
'Value out of range'
)
return
i
class
StatusOrTest
(
absltest
.
TestCase
):
class
StatusOrTest
(
absltest
.
TestCase
):
def
test_return_value_status_or_return_type_from_doc
(
self
):
def
test_return_value_status_or_return_type_from_doc
(
self
):
...
@@ -200,6 +208,12 @@ class StatusOrTest(absltest.TestCase):
...
@@ -200,6 +208,12 @@ class StatusOrTest(absltest.TestCase):
self
.
assertEqual
(
repr
(
failure_result
),
'CANCELLED: '
)
self
.
assertEqual
(
repr
(
failure_result
),
'CANCELLED: '
)
self
.
assertEqual
(
str
(
failure_result
),
'CANCELLED: '
)
self
.
assertEqual
(
str
(
failure_result
),
'CANCELLED: '
)
def
test_overriding_in_python
(
self
):
int_getter
=
IntGetter
()
self
.
assertEqual
(
int_getter
.
Get
(
5
),
5
)
with
self
.
assertRaises
(
ValueError
):
int_getter
.
Get
(
100
)
if
__name__
==
'__main__'
:
if
__name__
==
'__main__'
:
absltest
.
main
()
absltest
.
main
()
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment