mirror of
https://github.com/pybind/pybind11.git
synced 2024-11-24 22:25:10 +00:00
Support arbitrary type in item accessor's subscript operator
This commit is contained in:
parent
21f0e72b0f
commit
3a74bc41ef
@ -92,11 +92,8 @@ public:
|
|||||||
subclass causes a corresponding call to ``__getitem__``. Assigning a `handle`
|
subclass causes a corresponding call to ``__getitem__``. Assigning a `handle`
|
||||||
or `object` subclass causes a call to ``__setitem__``.
|
or `object` subclass causes a call to ``__setitem__``.
|
||||||
\endrst */
|
\endrst */
|
||||||
item_accessor operator[](handle key) const;
|
template <typename T>
|
||||||
/// See above (the only difference is that the key's reference is stolen)
|
item_accessor operator[](T &&key) const;
|
||||||
item_accessor operator[](object &&key) const;
|
|
||||||
/// See above (the only difference is that the key is provided as a string literal)
|
|
||||||
item_accessor operator[](const char *key) const;
|
|
||||||
|
|
||||||
/** \rst
|
/** \rst
|
||||||
Return an internal functor to access the object's attributes. Casting the
|
Return an internal functor to access the object's attributes. Casting the
|
||||||
@ -2270,16 +2267,9 @@ iterator object_api<D>::end() const {
|
|||||||
return iterator::sentinel();
|
return iterator::sentinel();
|
||||||
}
|
}
|
||||||
template <typename D>
|
template <typename D>
|
||||||
item_accessor object_api<D>::operator[](handle key) const {
|
template <typename T>
|
||||||
return {derived(), reinterpret_borrow<object>(key)};
|
item_accessor object_api<D>::operator[](T &&key) const {
|
||||||
}
|
return {derived(), reinterpret_borrow<object>(detail::object_or_cast(std::forward<T>(key)))};
|
||||||
template <typename D>
|
|
||||||
item_accessor object_api<D>::operator[](object &&key) const {
|
|
||||||
return {derived(), std::move(key)};
|
|
||||||
}
|
|
||||||
template <typename D>
|
|
||||||
item_accessor object_api<D>::operator[](const char *key) const {
|
|
||||||
return {derived(), pybind11::str(key)};
|
|
||||||
}
|
}
|
||||||
template <typename D>
|
template <typename D>
|
||||||
obj_attr_accessor object_api<D>::attr(handle key) const {
|
obj_attr_accessor object_api<D>::attr(handle key) const {
|
||||||
|
@ -126,6 +126,10 @@ TEST_SUBMODULE(pytypes, m) {
|
|||||||
m.def("tuple_ssize_t", []() { return py::tuple{(py::ssize_t) 0}; });
|
m.def("tuple_ssize_t", []() { return py::tuple{(py::ssize_t) 0}; });
|
||||||
m.def("tuple_size_t", []() { return py::tuple{(py::size_t) 0}; });
|
m.def("tuple_size_t", []() { return py::tuple{(py::size_t) 0}; });
|
||||||
m.def("get_tuple", []() { return py::make_tuple(42, py::none(), "spam"); });
|
m.def("get_tuple", []() { return py::make_tuple(42, py::none(), "spam"); });
|
||||||
|
m.def("access_tuple_with_int_index", []() {
|
||||||
|
py::object tpl = py::make_tuple(1, 2);
|
||||||
|
return tpl[1];
|
||||||
|
});
|
||||||
|
|
||||||
// test_simple_namespace
|
// test_simple_namespace
|
||||||
m.def("get_simple_namespace", []() {
|
m.def("get_simple_namespace", []() {
|
||||||
|
@ -152,6 +152,7 @@ def test_tuple():
|
|||||||
assert m.tuple_ssize_t() == ()
|
assert m.tuple_ssize_t() == ()
|
||||||
assert m.tuple_size_t() == ()
|
assert m.tuple_size_t() == ()
|
||||||
assert m.get_tuple() == (42, None, "spam")
|
assert m.get_tuple() == (42, None, "spam")
|
||||||
|
assert m.access_tuple_with_int_index() == (2)
|
||||||
|
|
||||||
|
|
||||||
def test_simple_namespace():
|
def test_simple_namespace():
|
||||||
|
Loading…
Reference in New Issue
Block a user