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
59827596
Commit
59827596
authored
Mar 29, 2023
by
Xiaofei Wang
Committed by
Copybara-Service
Mar 29, 2023
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Make `type_caster<absl::StatusOr<T>>` supports loading Python instance as `absl::Status`.
PiperOrigin-RevId: 520478536
parent
c6487c60
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
38 additions
and
3 deletions
+38
-3
pybind11_abseil/statusor_caster.h
+14
-3
pybind11_abseil/tests/status_example.cc
+8
-0
pybind11_abseil/tests/status_example_test.py
+16
-0
No files found.
pybind11_abseil/statusor_caster.h
View file @
59827596
...
@@ -45,9 +45,20 @@ struct type_caster<absl::StatusOr<PayloadType>> {
...
@@ -45,9 +45,20 @@ struct type_caster<absl::StatusOr<PayloadType>> {
PYBIND11_TYPE_CASTER
(
absl
::
StatusOr
<
PayloadType
>
,
PayloadCaster
::
name
);
PYBIND11_TYPE_CASTER
(
absl
::
StatusOr
<
PayloadType
>
,
PayloadCaster
::
name
);
bool
load
(
handle
src
,
bool
convert
)
{
bool
load
(
handle
src
,
bool
convert
)
{
PayloadCaster
base_caster
;
PayloadCaster
payload_caster
;
if
(
base_caster
.
load
(
src
,
convert
))
{
if
(
payload_caster
.
load
(
src
,
convert
))
{
value
=
cast_op
<
PayloadType
>
(
std
::
move
(
base_caster
));
value
=
cast_op
<
PayloadType
>
(
std
::
move
(
payload_caster
));
return
true
;
}
StatusCaster
status_caster
;
if
(
status_caster
.
load
(
src
,
convert
))
{
absl
::
Status
status
=
cast_op
<
absl
::
Status
>
(
std
::
move
(
status_caster
));
if
(
status
.
ok
())
{
throw
cast_error
(
"An OK status is not a valid constructor argument to StatusOr<T>."
);
}
else
{
value
=
status
;
}
return
true
;
return
true
;
}
}
return
false
;
return
false
;
...
...
pybind11_abseil/tests/status_example.cc
View file @
59827596
...
@@ -34,6 +34,13 @@ bool CheckStatus(const absl::Status& status, absl::StatusCode code) {
...
@@ -34,6 +34,13 @@ bool CheckStatus(const absl::Status& status, absl::StatusCode code) {
return
status
.
code
()
==
code
;
return
status
.
code
()
==
code
;
}
}
bool
CheckStatusOr
(
const
absl
::
StatusOr
<
int
>&
statusor
,
absl
::
StatusCode
code
)
{
if
(
statusor
.
ok
())
{
return
true
;
}
return
statusor
.
status
().
code
()
==
code
;
}
absl
::
Status
ReturnStatus
(
absl
::
StatusCode
code
,
const
std
::
string
&
text
=
""
)
{
absl
::
Status
ReturnStatus
(
absl
::
StatusCode
code
,
const
std
::
string
&
text
=
""
)
{
return
absl
::
Status
(
code
,
text
);
return
absl
::
Status
(
code
,
text
);
}
}
...
@@ -151,6 +158,7 @@ PYBIND11_MODULE(status_example, m) {
...
@@ -151,6 +158,7 @@ PYBIND11_MODULE(status_example, m) {
// absl::Status bindings
// absl::Status bindings
m
.
def
(
"check_status"
,
&
CheckStatus
,
arg
(
"status"
),
arg
(
"code"
));
m
.
def
(
"check_status"
,
&
CheckStatus
,
arg
(
"status"
),
arg
(
"code"
));
m
.
def
(
"check_statusor"
,
&
CheckStatusOr
,
arg
(
"statusor"
),
arg
(
"code"
));
m
.
def
(
"return_status"
,
&
ReturnStatus
,
"Raise an error if code is not OK."
,
m
.
def
(
"return_status"
,
&
ReturnStatus
,
"Raise an error if code is not OK."
,
arg
(
"code"
),
arg
(
"text"
)
=
""
);
arg
(
"code"
),
arg
(
"text"
)
=
""
);
m
.
def
(
"make_status"
,
google
::
DoNotThrowStatus
(
&
ReturnStatus
),
m
.
def
(
"make_status"
,
google
::
DoNotThrowStatus
(
&
ReturnStatus
),
...
...
pybind11_abseil/tests/status_example_test.py
View file @
59827596
...
@@ -43,6 +43,22 @@ class StatusTest(parameterized.TestCase):
...
@@ -43,6 +43,22 @@ class StatusTest(parameterized.TestCase):
self
.
assertTrue
(
self
.
assertTrue
(
status_example
.
check_status
(
test_status
,
status
.
StatusCode
.
CANCELLED
))
status_example
.
check_status
(
test_status
,
status
.
StatusCode
.
CANCELLED
))
def
test_pass_statusor
(
self
):
test_status
=
status
.
Status
(
status
.
StatusCode
.
CANCELLED
,
'test'
)
self
.
assertTrue
(
status_example
.
check_statusor
(
test_status
,
status
.
StatusCode
.
CANCELLED
))
test_status
=
status
.
Status
(
status
.
StatusCode
.
OK
,
'test'
)
with
self
.
assertRaises
(
RuntimeError
)
as
ctx
:
status_example
.
check_statusor
(
test_status
,
status
.
StatusCode
.
CANCELLED
)
self
.
assertEqual
(
str
(
ctx
.
exception
),
'An OK status is not a valid constructor argument to StatusOr<T>.'
)
with
self
.
assertRaises
(
RuntimeError
)
as
ctx
:
status_example
.
check_statusor
(
None
,
status
.
StatusCode
.
CANCELLED
)
self
.
assertEqual
(
str
(
ctx
.
exception
),
'An OK status is not a valid constructor argument to StatusOr<T>.'
)
def
test_return_status_return_type_from_doc
(
self
):
def
test_return_status_return_type_from_doc
(
self
):
self
.
assertEndsWith
(
self
.
assertEndsWith
(
docstring_signature
(
status_example
.
return_status
),
' -> None'
)
docstring_signature
(
status_example
.
return_status
),
' -> None'
)
...
...
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