/* pybind11/typing.h: Convenience wrapper classes for basic Python types with more explicit annotations. Copyright (c) 2023 Dustin Spicuzza All rights reserved. Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. */ #pragma once #include "detail/common.h" #include "cast.h" #include "pytypes.h" #include PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE) PYBIND11_NAMESPACE_BEGIN(typing) /* The following types can be used to direct pybind11-generated docstrings to have have more explicit types (e.g., `list[str]` instead of `list`). Just use these in place of existing types. There is no additional enforcement of types at runtime. */ template class Tuple : public tuple { using tuple::tuple; }; template class Dict : public dict { using dict::dict; }; template class List : public list { using list::list; }; template class Set : public set { using set::set; }; template class Iterable : public iterable { using iterable::iterable; }; template class Iterator : public iterator { using iterator::iterator; }; template class Callable; template class Callable : public function { using function::function; }; template class Type : public type { using type::type; }; template class Union : public object { PYBIND11_OBJECT_DEFAULT(Union, object, PyObject_Type) using object::object; }; template class Optional : public object { PYBIND11_OBJECT_DEFAULT(Optional, object, PyObject_Type) using object::object; }; template class TypeGuard : public bool_ { using bool_::bool_; }; template class TypeIs : public bool_ { using bool_::bool_; }; class NoReturn : public none { using none::none; }; class Never : public none { using none::none; }; #if defined(__cpp_nontype_template_parameter_class) \ && (/* See #5201 */ !defined(__GNUC__) \ || (__GNUC__ > 10 || (__GNUC__ == 10 && __GNUC_MINOR__ >= 3))) # define PYBIND11_TYPING_H_HAS_STRING_LITERAL template struct StringLiteral { constexpr StringLiteral(const char (&str)[N]) { std::copy_n(str, N, name); } char name[N]; }; template class Literal : public object { PYBIND11_OBJECT_DEFAULT(Literal, object, PyObject_Type) }; // Example syntax for creating a TypeVar. // typedef typing::TypeVar<"T"> TypeVarT; template class TypeVar : public object { PYBIND11_OBJECT_DEFAULT(TypeVar, object, PyObject_Type) using object::object; }; #endif PYBIND11_NAMESPACE_END(typing) PYBIND11_NAMESPACE_BEGIN(detail) template struct handle_type_name> { static constexpr auto name = const_name("tuple[") + ::pybind11::detail::concat(make_caster::name...) + const_name("]"); }; template <> struct handle_type_name> { // PEP 484 specifies this syntax for an empty tuple static constexpr auto name = const_name("tuple[()]"); }; template struct handle_type_name> { // PEP 484 specifies this syntax for a variable-length tuple static constexpr auto name = const_name("tuple[") + make_caster::name + const_name(", ...]"); }; template struct handle_type_name> { static constexpr auto name = const_name("dict[") + make_caster::name + const_name(", ") + make_caster::name + const_name("]"); }; template struct handle_type_name> { static constexpr auto name = const_name("list[") + make_caster::name + const_name("]"); }; template struct handle_type_name> { static constexpr auto name = const_name("set[") + make_caster::name + const_name("]"); }; template struct handle_type_name> { static constexpr auto name = const_name("Iterable[") + make_caster::name + const_name("]"); }; template struct handle_type_name> { static constexpr auto name = const_name("Iterator[") + make_caster::name + const_name("]"); }; template struct handle_type_name> { using retval_type = conditional_t::value, void_type, Return>; static constexpr auto name = const_name("Callable[[") + ::pybind11::detail::concat(make_caster::name...) + const_name("], ") + make_caster::name + const_name("]"); }; template struct handle_type_name> { // PEP 484 specifies this syntax for defining only return types of callables using retval_type = conditional_t::value, void_type, Return>; static constexpr auto name = const_name("Callable[..., ") + make_caster::name + const_name("]"); }; template struct handle_type_name> { static constexpr auto name = const_name("type[") + make_caster::name + const_name("]"); }; template struct handle_type_name> { static constexpr auto name = const_name("Union[") + ::pybind11::detail::concat(make_caster::name...) + const_name("]"); }; template struct handle_type_name> { static constexpr auto name = const_name("Optional[") + make_caster::name + const_name("]"); }; template struct handle_type_name> { static constexpr auto name = const_name("TypeGuard[") + make_caster::name + const_name("]"); }; template struct handle_type_name> { static constexpr auto name = const_name("TypeIs[") + make_caster::name + const_name("]"); }; template <> struct handle_type_name { static constexpr auto name = const_name("NoReturn"); }; template <> struct handle_type_name { static constexpr auto name = const_name("Never"); }; #if defined(PYBIND11_TYPING_H_HAS_STRING_LITERAL) template struct handle_type_name> { static constexpr auto name = const_name("Literal[") + pybind11::detail::concat(const_name(Literals.name)...) + const_name("]"); }; template struct handle_type_name> { static constexpr auto name = const_name(StrLit.name); }; #endif PYBIND11_NAMESPACE_END(detail) PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)