Commit 1d53beb5 by Xiaofei Wang Committed by Copybara-Service

Internal change

PiperOrigin-RevId: 427870099
parent d77d4f90
...@@ -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,
......
...@@ -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
......
...@@ -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()
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment