typing.h 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. /*
  2. pybind11/typing.h: Convenience wrapper classes for basic Python types
  3. with more explicit annotations.
  4. Copyright (c) 2023 Dustin Spicuzza <dustin@virtualroadside.com>
  5. All rights reserved. Use of this source code is governed by a
  6. BSD-style license that can be found in the LICENSE file.
  7. */
  8. #pragma once
  9. #include "detail/common.h"
  10. #include "cast.h"
  11. #include "pytypes.h"
  12. PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
  13. PYBIND11_NAMESPACE_BEGIN(typing)
  14. /*
  15. The following types can be used to direct pybind11-generated docstrings
  16. to have have more explicit types (e.g., `list[str]` instead of `list`).
  17. Just use these in place of existing types.
  18. There is no additional enforcement of types at runtime.
  19. */
  20. template <typename... Types>
  21. class Tuple : public tuple {
  22. using tuple::tuple;
  23. };
  24. template <typename K, typename V>
  25. class Dict : public dict {
  26. using dict::dict;
  27. };
  28. template <typename T>
  29. class List : public list {
  30. using list::list;
  31. };
  32. template <typename T>
  33. class Set : public set {
  34. using set::set;
  35. };
  36. template <typename T>
  37. class Iterable : public iterable {
  38. using iterable::iterable;
  39. };
  40. template <typename T>
  41. class Iterator : public iterator {
  42. using iterator::iterator;
  43. };
  44. template <typename Signature>
  45. class Callable;
  46. template <typename Return, typename... Args>
  47. class Callable<Return(Args...)> : public function {
  48. using function::function;
  49. };
  50. PYBIND11_NAMESPACE_END(typing)
  51. PYBIND11_NAMESPACE_BEGIN(detail)
  52. template <typename... Types>
  53. struct handle_type_name<typing::Tuple<Types...>> {
  54. static constexpr auto name = const_name("tuple[")
  55. + ::pybind11::detail::concat(make_caster<Types>::name...)
  56. + const_name("]");
  57. };
  58. template <>
  59. struct handle_type_name<typing::Tuple<>> {
  60. // PEP 484 specifies this syntax for an empty tuple
  61. static constexpr auto name = const_name("tuple[()]");
  62. };
  63. template <typename T>
  64. struct handle_type_name<typing::Tuple<T, ellipsis>> {
  65. // PEP 484 specifies this syntax for a variable-length tuple
  66. static constexpr auto name
  67. = const_name("tuple[") + make_caster<T>::name + const_name(", ...]");
  68. };
  69. template <typename K, typename V>
  70. struct handle_type_name<typing::Dict<K, V>> {
  71. static constexpr auto name = const_name("dict[") + make_caster<K>::name + const_name(", ")
  72. + make_caster<V>::name + const_name("]");
  73. };
  74. template <typename T>
  75. struct handle_type_name<typing::List<T>> {
  76. static constexpr auto name = const_name("list[") + make_caster<T>::name + const_name("]");
  77. };
  78. template <typename T>
  79. struct handle_type_name<typing::Set<T>> {
  80. static constexpr auto name = const_name("set[") + make_caster<T>::name + const_name("]");
  81. };
  82. template <typename T>
  83. struct handle_type_name<typing::Iterable<T>> {
  84. static constexpr auto name = const_name("Iterable[") + make_caster<T>::name + const_name("]");
  85. };
  86. template <typename T>
  87. struct handle_type_name<typing::Iterator<T>> {
  88. static constexpr auto name = const_name("Iterator[") + make_caster<T>::name + const_name("]");
  89. };
  90. template <typename Return, typename... Args>
  91. struct handle_type_name<typing::Callable<Return(Args...)>> {
  92. using retval_type = conditional_t<std::is_same<Return, void>::value, void_type, Return>;
  93. static constexpr auto name
  94. = const_name("Callable[[") + ::pybind11::detail::concat(make_caster<Args>::name...)
  95. + const_name("], ") + make_caster<retval_type>::name + const_name("]");
  96. };
  97. PYBIND11_NAMESPACE_END(detail)
  98. PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)