mirror of
https://github.com/pybind/pybind11.git
synced 2024-11-11 08:03:55 +00:00
Merge branch 'master' into master_with_dummy_change
This commit is contained in:
commit
23377c09ea
14
.github/workflows/ci.yml
vendored
14
.github/workflows/ci.yml
vendored
@ -108,12 +108,15 @@ jobs:
|
|||||||
run: python -m pip install pytest-github-actions-annotate-failures
|
run: python -m pip install pytest-github-actions-annotate-failures
|
||||||
|
|
||||||
# First build - C++11 mode and inplace
|
# First build - C++11 mode and inplace
|
||||||
# More-or-less randomly adding -DPYBIND11_SIMPLE_GIL_MANAGEMENT=ON here.
|
# More-or-less randomly adding -DPYBIND11_SIMPLE_GIL_MANAGEMENT=ON here
|
||||||
|
# (same for PYBIND11_NUMPY_1_ONLY, but requires a NumPy 1.x at runtime).
|
||||||
- name: Configure C++11 ${{ matrix.args }}
|
- name: Configure C++11 ${{ matrix.args }}
|
||||||
run: >
|
run: >
|
||||||
cmake -S . -B .
|
cmake -S . -B .
|
||||||
-DPYBIND11_WERROR=ON
|
-DPYBIND11_WERROR=ON
|
||||||
|
-DPYBIND11_DISABLE_HANDLE_TYPE_NAME_DEFAULT_IMPLEMENTATION=ON
|
||||||
-DPYBIND11_SIMPLE_GIL_MANAGEMENT=ON
|
-DPYBIND11_SIMPLE_GIL_MANAGEMENT=ON
|
||||||
|
-DPYBIND11_NUMPY_1_ONLY=ON
|
||||||
-DDOWNLOAD_CATCH=ON
|
-DDOWNLOAD_CATCH=ON
|
||||||
-DDOWNLOAD_EIGEN=ON
|
-DDOWNLOAD_EIGEN=ON
|
||||||
-DCMAKE_CXX_STANDARD=11
|
-DCMAKE_CXX_STANDARD=11
|
||||||
@ -138,11 +141,13 @@ jobs:
|
|||||||
|
|
||||||
# Second build - C++17 mode and in a build directory
|
# Second build - C++17 mode and in a build directory
|
||||||
# More-or-less randomly adding -DPYBIND11_SIMPLE_GIL_MANAGEMENT=OFF here.
|
# More-or-less randomly adding -DPYBIND11_SIMPLE_GIL_MANAGEMENT=OFF here.
|
||||||
|
# (same for PYBIND11_NUMPY_1_ONLY, but requires a NumPy 1.x at runtime).
|
||||||
- name: Configure C++17
|
- name: Configure C++17
|
||||||
run: >
|
run: >
|
||||||
cmake -S . -B build2
|
cmake -S . -B build2
|
||||||
-DPYBIND11_WERROR=ON
|
-DPYBIND11_WERROR=ON
|
||||||
-DPYBIND11_SIMPLE_GIL_MANAGEMENT=OFF
|
-DPYBIND11_SIMPLE_GIL_MANAGEMENT=OFF
|
||||||
|
-DPYBIND11_NUMPY_1_ONLY=ON
|
||||||
-DDOWNLOAD_CATCH=ON
|
-DDOWNLOAD_CATCH=ON
|
||||||
-DDOWNLOAD_EIGEN=ON
|
-DDOWNLOAD_EIGEN=ON
|
||||||
-DCMAKE_CXX_STANDARD=17
|
-DCMAKE_CXX_STANDARD=17
|
||||||
@ -660,6 +665,11 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
python3 -m pip install cmake -r tests/requirements.txt
|
python3 -m pip install cmake -r tests/requirements.txt
|
||||||
|
|
||||||
|
- name: Ensure NumPy 2 is used (required Python >= 3.9)
|
||||||
|
if: matrix.container == 'almalinux:9'
|
||||||
|
run: |
|
||||||
|
python3 -m pip install 'numpy>=2.0.0b1' 'scipy>=1.13.0rc1'
|
||||||
|
|
||||||
- name: Configure
|
- name: Configure
|
||||||
shell: bash
|
shell: bash
|
||||||
run: >
|
run: >
|
||||||
@ -895,8 +905,10 @@ jobs:
|
|||||||
python-version: ${{ matrix.python }}
|
python-version: ${{ matrix.python }}
|
||||||
|
|
||||||
- name: Prepare env
|
- name: Prepare env
|
||||||
|
# Ensure use of NumPy 2 (via NumPy nightlies but can be changed soon)
|
||||||
run: |
|
run: |
|
||||||
python3 -m pip install -r tests/requirements.txt
|
python3 -m pip install -r tests/requirements.txt
|
||||||
|
python3 -m pip install 'numpy>=2.0.0b1' 'scipy>=1.13.0rc1'
|
||||||
|
|
||||||
- name: Update CMake
|
- name: Update CMake
|
||||||
uses: jwlawson/actions-setup-cmake@v2.0
|
uses: jwlawson/actions-setup-cmake@v2.0
|
||||||
|
2
.github/workflows/configure.yml
vendored
2
.github/workflows/configure.yml
vendored
@ -35,7 +35,7 @@ jobs:
|
|||||||
|
|
||||||
- runs-on: ubuntu-20.04
|
- runs-on: ubuntu-20.04
|
||||||
arch: x64
|
arch: x64
|
||||||
cmake: "3.27"
|
cmake: "3.29"
|
||||||
|
|
||||||
- runs-on: macos-latest
|
- runs-on: macos-latest
|
||||||
arch: x64
|
arch: x64
|
||||||
|
2
.github/workflows/labeler.yml
vendored
2
.github/workflows/labeler.yml
vendored
@ -14,7 +14,7 @@ jobs:
|
|||||||
pull-requests: write
|
pull-requests: write
|
||||||
steps:
|
steps:
|
||||||
|
|
||||||
- uses: actions/labeler@main
|
- uses: actions/labeler@v4
|
||||||
if: >
|
if: >
|
||||||
github.event.pull_request.merged == true &&
|
github.event.pull_request.merged == true &&
|
||||||
!startsWith(github.event.pull_request.title, 'chore(deps):') &&
|
!startsWith(github.event.pull_request.title, 'chore(deps):') &&
|
||||||
|
@ -25,14 +25,14 @@ repos:
|
|||||||
|
|
||||||
# Clang format the codebase automatically
|
# Clang format the codebase automatically
|
||||||
- repo: https://github.com/pre-commit/mirrors-clang-format
|
- repo: https://github.com/pre-commit/mirrors-clang-format
|
||||||
rev: "v17.0.6"
|
rev: "v18.1.2"
|
||||||
hooks:
|
hooks:
|
||||||
- id: clang-format
|
- id: clang-format
|
||||||
types_or: [c++, c, cuda]
|
types_or: [c++, c, cuda]
|
||||||
|
|
||||||
# Ruff, the Python auto-correcting linter/formatter written in Rust
|
# Ruff, the Python auto-correcting linter/formatter written in Rust
|
||||||
- repo: https://github.com/astral-sh/ruff-pre-commit
|
- repo: https://github.com/astral-sh/ruff-pre-commit
|
||||||
rev: v0.2.0
|
rev: v0.3.5
|
||||||
hooks:
|
hooks:
|
||||||
- id: ruff
|
- id: ruff
|
||||||
args: ["--fix", "--show-fixes"]
|
args: ["--fix", "--show-fixes"]
|
||||||
@ -40,13 +40,13 @@ repos:
|
|||||||
|
|
||||||
# Check static types with mypy
|
# Check static types with mypy
|
||||||
- repo: https://github.com/pre-commit/mirrors-mypy
|
- repo: https://github.com/pre-commit/mirrors-mypy
|
||||||
rev: "v1.8.0"
|
rev: "v1.9.0"
|
||||||
hooks:
|
hooks:
|
||||||
- id: mypy
|
- id: mypy
|
||||||
args: []
|
args: []
|
||||||
exclude: ^(tests|docs)/
|
exclude: ^(tests|docs)/
|
||||||
additional_dependencies:
|
additional_dependencies:
|
||||||
- markdown-it-py<3 # Drop this together with dropping Python 3.7 support.
|
- markdown-it-py
|
||||||
- nox
|
- nox
|
||||||
- rich
|
- rich
|
||||||
- types-setuptools
|
- types-setuptools
|
||||||
@ -87,13 +87,13 @@ repos:
|
|||||||
|
|
||||||
# Changes tabs to spaces
|
# Changes tabs to spaces
|
||||||
- repo: https://github.com/Lucas-C/pre-commit-hooks
|
- repo: https://github.com/Lucas-C/pre-commit-hooks
|
||||||
rev: "v1.5.4"
|
rev: "v1.5.5"
|
||||||
hooks:
|
hooks:
|
||||||
- id: remove-tabs
|
- id: remove-tabs
|
||||||
|
|
||||||
# Avoid directional quotes
|
# Avoid directional quotes
|
||||||
- repo: https://github.com/sirosen/texthooks
|
- repo: https://github.com/sirosen/texthooks
|
||||||
rev: "0.6.4"
|
rev: "0.6.6"
|
||||||
hooks:
|
hooks:
|
||||||
- id: fix-ligatures
|
- id: fix-ligatures
|
||||||
- id: fix-smartquotes
|
- id: fix-smartquotes
|
||||||
@ -127,7 +127,7 @@ repos:
|
|||||||
|
|
||||||
# Check for common shell mistakes
|
# Check for common shell mistakes
|
||||||
- repo: https://github.com/shellcheck-py/shellcheck-py
|
- repo: https://github.com/shellcheck-py/shellcheck-py
|
||||||
rev: "v0.9.0.6"
|
rev: "v0.10.0.1"
|
||||||
hooks:
|
hooks:
|
||||||
- id: shellcheck
|
- id: shellcheck
|
||||||
|
|
||||||
@ -142,13 +142,13 @@ repos:
|
|||||||
|
|
||||||
# PyLint has native support - not always usable, but works for us
|
# PyLint has native support - not always usable, but works for us
|
||||||
- repo: https://github.com/PyCQA/pylint
|
- repo: https://github.com/PyCQA/pylint
|
||||||
rev: "v3.0.3"
|
rev: "v3.1.0"
|
||||||
hooks:
|
hooks:
|
||||||
- id: pylint
|
- id: pylint
|
||||||
files: ^pybind11
|
files: ^pybind11
|
||||||
|
|
||||||
- repo: https://github.com/python-jsonschema/check-jsonschema
|
- repo: https://github.com/python-jsonschema/check-jsonschema
|
||||||
rev: 0.28.0
|
rev: 0.28.1
|
||||||
hooks:
|
hooks:
|
||||||
- id: check-readthedocs
|
- id: check-readthedocs
|
||||||
- id: check-github-workflows
|
- id: check-github-workflows
|
||||||
|
@ -12,13 +12,13 @@ endif()
|
|||||||
|
|
||||||
cmake_minimum_required(VERSION 3.5)
|
cmake_minimum_required(VERSION 3.5)
|
||||||
|
|
||||||
# The `cmake_minimum_required(VERSION 3.5...3.27)` syntax does not work with
|
# The `cmake_minimum_required(VERSION 3.5...3.29)` syntax does not work with
|
||||||
# some versions of VS that have a patched CMake 3.11. This forces us to emulate
|
# some versions of VS that have a patched CMake 3.11. This forces us to emulate
|
||||||
# the behavior using the following workaround:
|
# the behavior using the following workaround:
|
||||||
if(${CMAKE_VERSION} VERSION_LESS 3.27)
|
if(${CMAKE_VERSION} VERSION_LESS 3.29)
|
||||||
cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
|
cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
|
||||||
else()
|
else()
|
||||||
cmake_policy(VERSION 3.27)
|
cmake_policy(VERSION 3.29)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(_pybind11_cmp0148)
|
if(_pybind11_cmp0148)
|
||||||
@ -107,15 +107,25 @@ endif()
|
|||||||
option(PYBIND11_INSTALL "Install pybind11 header files?" ${PYBIND11_MASTER_PROJECT})
|
option(PYBIND11_INSTALL "Install pybind11 header files?" ${PYBIND11_MASTER_PROJECT})
|
||||||
option(PYBIND11_TEST "Build pybind11 test suite?" ${PYBIND11_MASTER_PROJECT})
|
option(PYBIND11_TEST "Build pybind11 test suite?" ${PYBIND11_MASTER_PROJECT})
|
||||||
option(PYBIND11_NOPYTHON "Disable search for Python" OFF)
|
option(PYBIND11_NOPYTHON "Disable search for Python" OFF)
|
||||||
|
option(PYBIND11_DISABLE_HANDLE_TYPE_NAME_DEFAULT_IMPLEMENTATION
|
||||||
|
"To enforce that a handle_type_name<> specialization exists" OFF)
|
||||||
option(PYBIND11_SIMPLE_GIL_MANAGEMENT
|
option(PYBIND11_SIMPLE_GIL_MANAGEMENT
|
||||||
"Use simpler GIL management logic that does not support disassociation" OFF)
|
"Use simpler GIL management logic that does not support disassociation" OFF)
|
||||||
|
option(PYBIND11_NUMPY_1_ONLY
|
||||||
|
"Disable NumPy 2 support to avoid changes to previous pybind11 versions." OFF)
|
||||||
set(PYBIND11_INTERNALS_VERSION
|
set(PYBIND11_INTERNALS_VERSION
|
||||||
""
|
""
|
||||||
CACHE STRING "Override the ABI version, may be used to enable the unstable ABI.")
|
CACHE STRING "Override the ABI version, may be used to enable the unstable ABI.")
|
||||||
|
|
||||||
|
if(PYBIND11_DISABLE_HANDLE_TYPE_NAME_DEFAULT_IMPLEMENTATION)
|
||||||
|
add_compile_definitions(PYBIND11_DISABLE_HANDLE_TYPE_NAME_DEFAULT_IMPLEMENTATION)
|
||||||
|
endif()
|
||||||
if(PYBIND11_SIMPLE_GIL_MANAGEMENT)
|
if(PYBIND11_SIMPLE_GIL_MANAGEMENT)
|
||||||
add_compile_definitions(PYBIND11_SIMPLE_GIL_MANAGEMENT)
|
add_compile_definitions(PYBIND11_SIMPLE_GIL_MANAGEMENT)
|
||||||
endif()
|
endif()
|
||||||
|
if(PYBIND11_NUMPY_1_ONLY)
|
||||||
|
add_compile_definitions(PYBIND11_NUMPY_1_ONLY)
|
||||||
|
endif()
|
||||||
|
|
||||||
cmake_dependent_option(
|
cmake_dependent_option(
|
||||||
USE_PYTHON_INCLUDE_DIR
|
USE_PYTHON_INCLUDE_DIR
|
||||||
|
@ -36,10 +36,10 @@ with everything stripped away that isn't relevant for binding
|
|||||||
generation. Without comments, the core header files only require ~4K
|
generation. Without comments, the core header files only require ~4K
|
||||||
lines of code and depend on Python (3.6+, or PyPy) and the C++
|
lines of code and depend on Python (3.6+, or PyPy) and the C++
|
||||||
standard library. This compact implementation was possible thanks to
|
standard library. This compact implementation was possible thanks to
|
||||||
some of the new C++11 language features (specifically: tuples, lambda
|
some C++11 language features (specifically: tuples, lambda functions and
|
||||||
functions and variadic templates). Since its creation, this library has
|
variadic templates). Since its creation, this library has grown beyond
|
||||||
grown beyond Boost.Python in many ways, leading to dramatically simpler
|
Boost.Python in many ways, leading to dramatically simpler binding code in many
|
||||||
binding code in many common situations.
|
common situations.
|
||||||
|
|
||||||
Tutorial and reference documentation is provided at
|
Tutorial and reference documentation is provided at
|
||||||
`pybind11.readthedocs.io <https://pybind11.readthedocs.io/en/latest>`_.
|
`pybind11.readthedocs.io <https://pybind11.readthedocs.io/en/latest>`_.
|
||||||
@ -71,6 +71,7 @@ pybind11 can map the following core C++ features to Python:
|
|||||||
- Internal references with correct reference counting
|
- Internal references with correct reference counting
|
||||||
- C++ classes with virtual (and pure virtual) methods can be extended
|
- C++ classes with virtual (and pure virtual) methods can be extended
|
||||||
in Python
|
in Python
|
||||||
|
- Integrated NumPy support (NumPy 2 requires pybind11 2.12+)
|
||||||
|
|
||||||
Goodies
|
Goodies
|
||||||
-------
|
-------
|
||||||
|
@ -18,7 +18,7 @@ information, see :doc:`/compiling`.
|
|||||||
|
|
||||||
.. code-block:: cmake
|
.. code-block:: cmake
|
||||||
|
|
||||||
cmake_minimum_required(VERSION 3.5...3.27)
|
cmake_minimum_required(VERSION 3.5...3.29)
|
||||||
project(example)
|
project(example)
|
||||||
|
|
||||||
find_package(pybind11 REQUIRED) # or `add_subdirectory(pybind11)`
|
find_package(pybind11 REQUIRED) # or `add_subdirectory(pybind11)`
|
||||||
|
@ -15,9 +15,183 @@ IN DEVELOPMENT
|
|||||||
|
|
||||||
Changes will be summarized here periodically.
|
Changes will be summarized here periodically.
|
||||||
|
|
||||||
|
Version 2.12.0 (March 27, 2025)
|
||||||
|
-------------------------------
|
||||||
|
|
||||||
|
New Features:
|
||||||
|
|
||||||
|
* ``pybind11`` now supports compiling for
|
||||||
|
`NumPy 2 <https://numpy.org/devdocs/numpy_2_0_migration_guide.html>`_. Most
|
||||||
|
code shouldn't change (see :ref:`upgrade-guide-2.12` for details). However,
|
||||||
|
if you experience issues you can define ``PYBIND11_NUMPY_1_ONLY`` to disable
|
||||||
|
the new support for now, but this will be removed in the future.
|
||||||
|
`#5050 <https://github.com/pybind/pybind11/pull/5050>`_
|
||||||
|
|
||||||
|
* ``pybind11/gil_safe_call_once.h`` was added (it needs to be included
|
||||||
|
explicitly). The primary use case is GIL-safe initialization of C++
|
||||||
|
``static`` variables.
|
||||||
|
`#4877 <https://github.com/pybind/pybind11/pull/4877>`_
|
||||||
|
|
||||||
|
* Support move-only iterators in ``py::make_iterator``,
|
||||||
|
``py::make_key_iterator``, ``py::make_value_iterator``.
|
||||||
|
`#4834 <https://github.com/pybind/pybind11/pull/4834>`_
|
||||||
|
|
||||||
|
* Two simple ``py::set_error()`` functions were added and the documentation was
|
||||||
|
updated accordingly. In particular, ``py::exception<>::operator()`` was
|
||||||
|
deprecated (use one of the new functions instead). The documentation for
|
||||||
|
``py::exception<>`` was further updated to not suggest code that may result
|
||||||
|
in undefined behavior.
|
||||||
|
`#4772 <https://github.com/pybind/pybind11/pull/4772>`_
|
||||||
|
|
||||||
|
Bug fixes:
|
||||||
|
|
||||||
|
* Removes potential for Undefined Behavior during process teardown.
|
||||||
|
`#4897 <https://github.com/pybind/pybind11/pull/4897>`_
|
||||||
|
|
||||||
|
* Improve compatibility with the nvcc compiler (especially CUDA 12.1/12.2).
|
||||||
|
`#4893 <https://github.com/pybind/pybind11/pull/4893>`_
|
||||||
|
|
||||||
|
* ``pybind11/numpy.h`` now imports NumPy's ``multiarray`` and ``_internal``
|
||||||
|
submodules with paths depending on the installed version of NumPy (for
|
||||||
|
compatibility with NumPy 2).
|
||||||
|
`#4857 <https://github.com/pybind/pybind11/pull/4857>`_
|
||||||
|
|
||||||
|
* Builtins collections names in docstrings are now consistently rendered in
|
||||||
|
lowercase (list, set, dict, tuple), in accordance with PEP 585.
|
||||||
|
`#4833 <https://github.com/pybind/pybind11/pull/4833>`_
|
||||||
|
|
||||||
|
* Added ``py::typing::Iterator<T>``, ``py::typing::Iterable<T>``.
|
||||||
|
`#4832 <https://github.com/pybind/pybind11/pull/4832>`_
|
||||||
|
|
||||||
|
* Render ``py::function`` as ``Callable`` in docstring.
|
||||||
|
`#4829 <https://github.com/pybind/pybind11/pull/4829>`_
|
||||||
|
|
||||||
|
* Also bump ``PYBIND11_INTERNALS_VERSION`` for MSVC, which unlocks two new
|
||||||
|
features without creating additional incompatibilities.
|
||||||
|
`#4819 <https://github.com/pybind/pybind11/pull/4819>`_
|
||||||
|
|
||||||
|
* Guard against crashes/corruptions caused by modules built with different MSVC
|
||||||
|
versions.
|
||||||
|
`#4779 <https://github.com/pybind/pybind11/pull/4779>`_
|
||||||
|
|
||||||
|
* A long-standing bug in the handling of Python multiple inheritance was fixed.
|
||||||
|
See PR #4762 for the rather complex details.
|
||||||
|
`#4762 <https://github.com/pybind/pybind11/pull/4762>`_
|
||||||
|
|
||||||
|
* Fix ``bind_map`` with ``using`` declarations.
|
||||||
|
`#4952 <https://github.com/pybind/pybind11/pull/4952>`_
|
||||||
|
|
||||||
|
* Qualify ``py::detail::concat`` usage to avoid ADL selecting one from
|
||||||
|
somewhere else, such as modernjson's concat.
|
||||||
|
`#4955 <https://github.com/pybind/pybind11/pull/4955>`_
|
||||||
|
|
||||||
|
* Use new PyCode API on Python 3.12+.
|
||||||
|
`#4916 <https://github.com/pybind/pybind11/pull/4916>`_
|
||||||
|
|
||||||
|
* Minor cleanup from warnings reported by Clazy.
|
||||||
|
`#4988 <https://github.com/pybind/pybind11/pull/4988>`_
|
||||||
|
|
||||||
|
* Remove typing and duplicate ``class_`` for ``KeysView``/``ValuesView``/``ItemsView``.
|
||||||
|
`#4985 <https://github.com/pybind/pybind11/pull/4985>`_
|
||||||
|
|
||||||
|
* Use ``PyObject_VisitManagedDict()`` and ``PyObject_ClearManagedDict()`` on Python 3.13 and newer.
|
||||||
|
`#4973 <https://github.com/pybind/pybind11/pull/4973>`_
|
||||||
|
|
||||||
|
* Update ``make_static_property_type()`` to make it compatible with Python 3.13.
|
||||||
|
`#4971 <https://github.com/pybind/pybind11/pull/4971>`_
|
||||||
|
|
||||||
|
.. fix(types)
|
||||||
|
|
||||||
|
* Render typed iterators for ``make_iterator``, ``make_key_iterator``,
|
||||||
|
``make_value_iterator``.
|
||||||
|
`#4876 <https://github.com/pybind/pybind11/pull/4876>`_
|
||||||
|
|
||||||
|
* Add several missing type name specializations.
|
||||||
|
`#5073 <https://github.com/pybind/pybind11/pull/5073>`_
|
||||||
|
|
||||||
|
* Change docstring render for ``py::buffer``, ``py::sequence`` and
|
||||||
|
``py::handle`` (to ``Buffer``, ``Sequence``, ``Any``).
|
||||||
|
`#4831 <https://github.com/pybind/pybind11/pull/4831>`_
|
||||||
|
|
||||||
|
* Fixed ``base_enum.__str__`` docstring.
|
||||||
|
`#4827 <https://github.com/pybind/pybind11/pull/4827>`_
|
||||||
|
|
||||||
|
* Enforce single line docstring signatures.
|
||||||
|
`#4735 <https://github.com/pybind/pybind11/pull/4735>`_
|
||||||
|
|
||||||
|
* Special 'typed' wrappers now available in ``typing.h`` to annotate tuple, dict,
|
||||||
|
list, set, and function.
|
||||||
|
`#4259 <https://github.com/pybind/pybind11/pull/4259>`_
|
||||||
|
|
||||||
|
* Create ``handle_type_name`` specialization to type-hint variable length tuples.
|
||||||
|
`#5051 <https://github.com/pybind/pybind11/pull/5051>`_
|
||||||
|
|
||||||
|
.. fix(build)
|
||||||
|
|
||||||
|
* Setting ``PYBIND11_FINDPYTHON`` to OFF will force the old FindPythonLibs mechanism to be used.
|
||||||
|
`#5042 <https://github.com/pybind/pybind11/pull/5042>`_
|
||||||
|
|
||||||
|
* Skip empty ``PYBIND11_PYTHON_EXECUTABLE_LAST`` for the first cmake run.
|
||||||
|
`#4856 <https://github.com/pybind/pybind11/pull/4856>`_
|
||||||
|
|
||||||
|
* Fix FindPython mode exports & avoid ``pkg_resources`` if
|
||||||
|
``importlib.metadata`` available.
|
||||||
|
`#4941 <https://github.com/pybind/pybind11/pull/4941>`_
|
||||||
|
|
||||||
|
* ``Python_ADDITIONAL_VERSIONS`` (classic search) now includes 3.12.
|
||||||
|
`#4909 <https://github.com/pybind/pybind11/pull/4909>`_
|
||||||
|
|
||||||
|
* ``pybind11.pc`` is now relocatable by default as long as install destinations
|
||||||
|
are not absolute paths.
|
||||||
|
`#4830 <https://github.com/pybind/pybind11/pull/4830>`_
|
||||||
|
|
||||||
|
* Correctly detect CMake FindPython removal when used as a subdirectory.
|
||||||
|
`#4806 <https://github.com/pybind/pybind11/pull/4806>`_
|
||||||
|
|
||||||
|
* Don't require the libs component on CMake 3.18+ when using
|
||||||
|
PYBIND11_FINDPYTHON (fixes manylinux builds).
|
||||||
|
`#4805 <https://github.com/pybind/pybind11/pull/4805>`_
|
||||||
|
|
||||||
|
* ``pybind11_strip`` is no longer automatically applied when
|
||||||
|
``CMAKE_BUILD_TYPE`` is unset.
|
||||||
|
`#4780 <https://github.com/pybind/pybind11/pull/4780>`_
|
||||||
|
|
||||||
|
* Support ``DEBUG_POSFIX`` correctly for debug builds.
|
||||||
|
`#4761 <https://github.com/pybind/pybind11/pull/4761>`_
|
||||||
|
|
||||||
|
* Hardcode lto/thin lto for Emscripten cross-compiles.
|
||||||
|
`#4642 <https://github.com/pybind/pybind11/pull/4642>`_
|
||||||
|
|
||||||
|
* Upgrade maximum supported CMake version to 3.27 to fix CMP0148 warnings.
|
||||||
|
`#4786 <https://github.com/pybind/pybind11/pull/4786>`_
|
||||||
|
|
||||||
|
Documentation:
|
||||||
|
|
||||||
|
* Small fix to grammar in ``functions.rst``.
|
||||||
|
`#4791 <https://github.com/pybind/pybind11/pull/4791>`_
|
||||||
|
|
||||||
|
* Remove upper bound in example pyproject.toml for setuptools.
|
||||||
|
`#4774 <https://github.com/pybind/pybind11/pull/4774>`_
|
||||||
|
|
||||||
|
CI:
|
||||||
|
|
||||||
|
* CI: Update NVHPC to 23.5 and Ubuntu 20.04.
|
||||||
|
`#4764 <https://github.com/pybind/pybind11/pull/4764>`_
|
||||||
|
|
||||||
|
* Test on PyPy 3.10.
|
||||||
|
`#4714 <https://github.com/pybind/pybind11/pull/4714>`_
|
||||||
|
|
||||||
|
Other:
|
||||||
|
|
||||||
|
* Use Ruff formatter instead of Black.
|
||||||
|
`#4912 <https://github.com/pybind/pybind11/pull/4912>`_
|
||||||
|
|
||||||
|
* An ``assert()`` was added to help Coverty avoid generating a false positive.
|
||||||
|
`#4817 <https://github.com/pybind/pybind11/pull/4817>`_
|
||||||
|
|
||||||
|
|
||||||
Version 2.11.1 (July 17, 2023)
|
Version 2.11.1 (July 17, 2023)
|
||||||
-----------------------------
|
------------------------------
|
||||||
|
|
||||||
Changes:
|
Changes:
|
||||||
|
|
||||||
@ -32,7 +206,7 @@ Changes:
|
|||||||
|
|
||||||
|
|
||||||
Version 2.11.0 (July 14, 2023)
|
Version 2.11.0 (July 14, 2023)
|
||||||
-----------------------------
|
------------------------------
|
||||||
|
|
||||||
New features:
|
New features:
|
||||||
|
|
||||||
|
@ -241,7 +241,7 @@ extension module can be created with just a few lines of code:
|
|||||||
|
|
||||||
.. code-block:: cmake
|
.. code-block:: cmake
|
||||||
|
|
||||||
cmake_minimum_required(VERSION 3.5...3.27)
|
cmake_minimum_required(VERSION 3.5...3.29)
|
||||||
project(example LANGUAGES CXX)
|
project(example LANGUAGES CXX)
|
||||||
|
|
||||||
add_subdirectory(pybind11)
|
add_subdirectory(pybind11)
|
||||||
@ -498,7 +498,7 @@ You can use these targets to build complex applications. For example, the
|
|||||||
|
|
||||||
.. code-block:: cmake
|
.. code-block:: cmake
|
||||||
|
|
||||||
cmake_minimum_required(VERSION 3.5...3.27)
|
cmake_minimum_required(VERSION 3.5...3.29)
|
||||||
project(example LANGUAGES CXX)
|
project(example LANGUAGES CXX)
|
||||||
|
|
||||||
find_package(pybind11 REQUIRED) # or add_subdirectory(pybind11)
|
find_package(pybind11 REQUIRED) # or add_subdirectory(pybind11)
|
||||||
@ -556,7 +556,7 @@ information about usage in C++, see :doc:`/advanced/embedding`.
|
|||||||
|
|
||||||
.. code-block:: cmake
|
.. code-block:: cmake
|
||||||
|
|
||||||
cmake_minimum_required(VERSION 3.5...3.27)
|
cmake_minimum_required(VERSION 3.5...3.29)
|
||||||
project(example LANGUAGES CXX)
|
project(example LANGUAGES CXX)
|
||||||
|
|
||||||
find_package(pybind11 REQUIRED) # or add_subdirectory(pybind11)
|
find_package(pybind11 REQUIRED) # or add_subdirectory(pybind11)
|
||||||
|
@ -36,19 +36,19 @@ If you don't have nox, you should either use ``pipx run nox`` instead, or use
|
|||||||
|
|
||||||
- Run ``nox -s tests_packaging`` to ensure this was done correctly.
|
- Run ``nox -s tests_packaging`` to ensure this was done correctly.
|
||||||
|
|
||||||
- Ensure that all the information in ``setup.cfg`` is up-to-date, like
|
- Ensure that all the information in ``setup.cfg`` is up-to-date, like
|
||||||
supported Python versions.
|
supported Python versions.
|
||||||
|
|
||||||
- Add release date in ``docs/changelog.rst`` and integrate the output of
|
- Add release date in ``docs/changelog.rst`` and integrate the output of
|
||||||
``nox -s make_changelog``.
|
``nox -s make_changelog``.
|
||||||
|
|
||||||
- Note that the ``make_changelog`` command inspects
|
- Note that the ``nox -s make_changelog`` command inspects
|
||||||
`needs changelog <https://github.com/pybind/pybind11/pulls?q=is%3Apr+is%3Aclosed+label%3A%22needs+changelog%22>`_.
|
`needs changelog <https://github.com/pybind/pybind11/pulls?q=is%3Apr+is%3Aclosed+label%3A%22needs+changelog%22>`_.
|
||||||
|
|
||||||
- Manually clear the ``needs changelog`` labels using the GitHub web
|
- Manually clear the ``needs changelog`` labels using the GitHub web
|
||||||
interface (very easy: start by clicking the link above).
|
interface (very easy: start by clicking the link above).
|
||||||
|
|
||||||
- ``git add`` and ``git commit``, ``git push``. **Ensure CI passes**. (If it
|
- ``git add`` and ``git commit``, ``git push``. **Ensure CI passes**. (If it
|
||||||
fails due to a known flake issue, either ignore or restart CI.)
|
fails due to a known flake issue, either ignore or restart CI.)
|
||||||
|
|
||||||
- Add a release branch if this is a new MINOR version, or update the existing
|
- Add a release branch if this is a new MINOR version, or update the existing
|
||||||
|
@ -8,6 +8,34 @@ to a new version. But it goes into more detail. This includes things like
|
|||||||
deprecated APIs and their replacements, build system changes, general code
|
deprecated APIs and their replacements, build system changes, general code
|
||||||
modernization and other useful information.
|
modernization and other useful information.
|
||||||
|
|
||||||
|
.. _upgrade-guide-2.12:
|
||||||
|
|
||||||
|
v2.12
|
||||||
|
=====
|
||||||
|
|
||||||
|
NumPy support has been upgraded to support the 2.x series too. The two relevant
|
||||||
|
changes are that:
|
||||||
|
|
||||||
|
* ``dtype.flags()`` is now a ``uint64`` and ``dtype.alignment()`` an
|
||||||
|
``ssize_t`` (and NumPy may return an larger than integer value for
|
||||||
|
``itemsize()`` in NumPy 2.x).
|
||||||
|
|
||||||
|
* The long deprecated NumPy function ``PyArray_GetArrayParamsFromObject``
|
||||||
|
function is not available anymore.
|
||||||
|
|
||||||
|
Due to NumPy changes, you may experience difficulties updating to NumPy 2.
|
||||||
|
Please see the [NumPy 2 migration guide](https://numpy.org/devdocs/numpy_2_0_migration_guide.html) for details.
|
||||||
|
For example, a more direct change could be that the default integer ``"int_"``
|
||||||
|
(and ``"uint"``) is now ``ssize_t`` and not ``long`` (affects 64bit windows).
|
||||||
|
|
||||||
|
If you want to only support NumPy 1.x for now and are having problems due to
|
||||||
|
the two internal changes listed above, you can define
|
||||||
|
``PYBIND11_NUMPY_1_ONLY`` to disable the new support for now. Make sure you
|
||||||
|
define this on all pybind11 compile units, since it could be a source of ODR
|
||||||
|
violations if used inconsistently. This option will be removed in the future,
|
||||||
|
so adapting your code is highly recommended.
|
||||||
|
|
||||||
|
|
||||||
.. _upgrade-guide-2.11:
|
.. _upgrade-guide-2.11:
|
||||||
|
|
||||||
v2.11
|
v2.11
|
||||||
|
@ -102,22 +102,22 @@ struct buffer_info {
|
|||||||
template <typename T>
|
template <typename T>
|
||||||
buffer_info(const T *ptr, ssize_t size, bool readonly = true)
|
buffer_info(const T *ptr, ssize_t size, bool readonly = true)
|
||||||
: buffer_info(
|
: buffer_info(
|
||||||
const_cast<T *>(ptr), sizeof(T), format_descriptor<T>::format(), size, readonly) {}
|
const_cast<T *>(ptr), sizeof(T), format_descriptor<T>::format(), size, readonly) {}
|
||||||
|
|
||||||
explicit buffer_info(Py_buffer *view, bool ownview = true)
|
explicit buffer_info(Py_buffer *view, bool ownview = true)
|
||||||
: buffer_info(
|
: buffer_info(
|
||||||
view->buf,
|
view->buf,
|
||||||
view->itemsize,
|
view->itemsize,
|
||||||
view->format,
|
view->format,
|
||||||
view->ndim,
|
view->ndim,
|
||||||
{view->shape, view->shape + view->ndim},
|
{view->shape, view->shape + view->ndim},
|
||||||
/* Though buffer::request() requests PyBUF_STRIDES, ctypes objects
|
/* Though buffer::request() requests PyBUF_STRIDES, ctypes objects
|
||||||
* ignore this flag and return a view with NULL strides.
|
* ignore this flag and return a view with NULL strides.
|
||||||
* When strides are NULL, build them manually. */
|
* When strides are NULL, build them manually. */
|
||||||
view->strides
|
view->strides
|
||||||
? std::vector<ssize_t>(view->strides, view->strides + view->ndim)
|
? std::vector<ssize_t>(view->strides, view->strides + view->ndim)
|
||||||
: detail::c_strides({view->shape, view->shape + view->ndim}, view->itemsize),
|
: detail::c_strides({view->shape, view->shape + view->ndim}, view->itemsize),
|
||||||
(view->readonly != 0)) {
|
(view->readonly != 0)) {
|
||||||
// NOLINTNEXTLINE(cppcoreguidelines-prefer-member-initializer)
|
// NOLINTNEXTLINE(cppcoreguidelines-prefer-member-initializer)
|
||||||
this->m_view = view;
|
this->m_view = view;
|
||||||
// NOLINTNEXTLINE(cppcoreguidelines-prefer-member-initializer)
|
// NOLINTNEXTLINE(cppcoreguidelines-prefer-member-initializer)
|
||||||
@ -176,7 +176,7 @@ private:
|
|||||||
detail::any_container<ssize_t> &&strides_in,
|
detail::any_container<ssize_t> &&strides_in,
|
||||||
bool readonly)
|
bool readonly)
|
||||||
: buffer_info(
|
: buffer_info(
|
||||||
ptr, itemsize, format, ndim, std::move(shape_in), std::move(strides_in), readonly) {}
|
ptr, itemsize, format, ndim, std::move(shape_in), std::move(strides_in), readonly) {}
|
||||||
|
|
||||||
Py_buffer *m_view = nullptr;
|
Py_buffer *m_view = nullptr;
|
||||||
bool ownview = false;
|
bool ownview = false;
|
||||||
|
@ -327,8 +327,9 @@ public:
|
|||||||
value = false;
|
value = false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (convert || (std::strcmp("numpy.bool_", Py_TYPE(src.ptr())->tp_name) == 0)) {
|
if (convert || is_numpy_bool(src)) {
|
||||||
// (allow non-implicit conversion for numpy booleans)
|
// (allow non-implicit conversion for numpy booleans), use strncmp
|
||||||
|
// since NumPy 1.x had an additional trailing underscore.
|
||||||
|
|
||||||
Py_ssize_t res = -1;
|
Py_ssize_t res = -1;
|
||||||
if (src.is_none()) {
|
if (src.is_none()) {
|
||||||
@ -360,6 +361,15 @@ public:
|
|||||||
return handle(src ? Py_True : Py_False).inc_ref();
|
return handle(src ? Py_True : Py_False).inc_ref();
|
||||||
}
|
}
|
||||||
PYBIND11_TYPE_CASTER(bool, const_name("bool"));
|
PYBIND11_TYPE_CASTER(bool, const_name("bool"));
|
||||||
|
|
||||||
|
private:
|
||||||
|
// Test if an object is a NumPy boolean (without fetching the type).
|
||||||
|
static inline bool is_numpy_bool(handle object) {
|
||||||
|
const char *type_name = Py_TYPE(object.ptr())->tp_name;
|
||||||
|
// Name changed to `numpy.bool` in NumPy 2, `numpy.bool_` is needed for 1.x support
|
||||||
|
return std::strcmp("numpy.bool", type_name) == 0
|
||||||
|
|| std::strcmp("numpy.bool_", type_name) == 0;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Helper class for UTF-{8,16,32} C++ stl strings:
|
// Helper class for UTF-{8,16,32} C++ stl strings:
|
||||||
@ -662,8 +672,9 @@ public:
|
|||||||
return cast(*src, policy, parent);
|
return cast(*src, policy, parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
static constexpr auto name
|
static constexpr auto name = const_name("tuple[")
|
||||||
= const_name("tuple[") + concat(make_caster<Ts>::name...) + const_name("]");
|
+ ::pybind11::detail::concat(make_caster<Ts>::name...)
|
||||||
|
+ const_name("]");
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
using cast_op_type = type;
|
using cast_op_type = type;
|
||||||
@ -871,10 +882,53 @@ struct is_holder_type
|
|||||||
template <typename base, typename deleter>
|
template <typename base, typename deleter>
|
||||||
struct is_holder_type<base, std::unique_ptr<base, deleter>> : std::true_type {};
|
struct is_holder_type<base, std::unique_ptr<base, deleter>> : std::true_type {};
|
||||||
|
|
||||||
|
#ifdef PYBIND11_DISABLE_HANDLE_TYPE_NAME_DEFAULT_IMPLEMENTATION // See PR #4888
|
||||||
|
|
||||||
|
// This leads to compilation errors if a specialization is missing.
|
||||||
|
template <typename T>
|
||||||
|
struct handle_type_name;
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
struct handle_type_name {
|
struct handle_type_name {
|
||||||
static constexpr auto name = const_name<T>();
|
static constexpr auto name = const_name<T>();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct handle_type_name<object> {
|
||||||
|
static constexpr auto name = const_name("object");
|
||||||
|
};
|
||||||
|
template <>
|
||||||
|
struct handle_type_name<list> {
|
||||||
|
static constexpr auto name = const_name("list");
|
||||||
|
};
|
||||||
|
template <>
|
||||||
|
struct handle_type_name<dict> {
|
||||||
|
static constexpr auto name = const_name("dict");
|
||||||
|
};
|
||||||
|
template <>
|
||||||
|
struct handle_type_name<anyset> {
|
||||||
|
static constexpr auto name = const_name("Union[set, frozenset]");
|
||||||
|
};
|
||||||
|
template <>
|
||||||
|
struct handle_type_name<set> {
|
||||||
|
static constexpr auto name = const_name("set");
|
||||||
|
};
|
||||||
|
template <>
|
||||||
|
struct handle_type_name<frozenset> {
|
||||||
|
static constexpr auto name = const_name("frozenset");
|
||||||
|
};
|
||||||
|
template <>
|
||||||
|
struct handle_type_name<str> {
|
||||||
|
static constexpr auto name = const_name("str");
|
||||||
|
};
|
||||||
|
template <>
|
||||||
|
struct handle_type_name<tuple> {
|
||||||
|
static constexpr auto name = const_name("tuple");
|
||||||
|
};
|
||||||
template <>
|
template <>
|
||||||
struct handle_type_name<bool_> {
|
struct handle_type_name<bool_> {
|
||||||
static constexpr auto name = const_name("bool");
|
static constexpr auto name = const_name("bool");
|
||||||
@ -920,6 +974,34 @@ struct handle_type_name<sequence> {
|
|||||||
static constexpr auto name = const_name("Sequence");
|
static constexpr auto name = const_name("Sequence");
|
||||||
};
|
};
|
||||||
template <>
|
template <>
|
||||||
|
struct handle_type_name<bytearray> {
|
||||||
|
static constexpr auto name = const_name("bytearray");
|
||||||
|
};
|
||||||
|
template <>
|
||||||
|
struct handle_type_name<memoryview> {
|
||||||
|
static constexpr auto name = const_name("memoryview");
|
||||||
|
};
|
||||||
|
template <>
|
||||||
|
struct handle_type_name<slice> {
|
||||||
|
static constexpr auto name = const_name("slice");
|
||||||
|
};
|
||||||
|
template <>
|
||||||
|
struct handle_type_name<type> {
|
||||||
|
static constexpr auto name = const_name("type");
|
||||||
|
};
|
||||||
|
template <>
|
||||||
|
struct handle_type_name<capsule> {
|
||||||
|
static constexpr auto name = const_name("capsule");
|
||||||
|
};
|
||||||
|
template <>
|
||||||
|
struct handle_type_name<ellipsis> {
|
||||||
|
static constexpr auto name = const_name("ellipsis");
|
||||||
|
};
|
||||||
|
template <>
|
||||||
|
struct handle_type_name<weakref> {
|
||||||
|
static constexpr auto name = const_name("weakref");
|
||||||
|
};
|
||||||
|
template <>
|
||||||
struct handle_type_name<args> {
|
struct handle_type_name<args> {
|
||||||
static constexpr auto name = const_name("*args");
|
static constexpr auto name = const_name("*args");
|
||||||
};
|
};
|
||||||
@ -927,6 +1009,30 @@ template <>
|
|||||||
struct handle_type_name<kwargs> {
|
struct handle_type_name<kwargs> {
|
||||||
static constexpr auto name = const_name("**kwargs");
|
static constexpr auto name = const_name("**kwargs");
|
||||||
};
|
};
|
||||||
|
template <>
|
||||||
|
struct handle_type_name<obj_attr_accessor> {
|
||||||
|
static constexpr auto name = const_name<obj_attr_accessor>();
|
||||||
|
};
|
||||||
|
template <>
|
||||||
|
struct handle_type_name<str_attr_accessor> {
|
||||||
|
static constexpr auto name = const_name<str_attr_accessor>();
|
||||||
|
};
|
||||||
|
template <>
|
||||||
|
struct handle_type_name<item_accessor> {
|
||||||
|
static constexpr auto name = const_name<item_accessor>();
|
||||||
|
};
|
||||||
|
template <>
|
||||||
|
struct handle_type_name<sequence_accessor> {
|
||||||
|
static constexpr auto name = const_name<sequence_accessor>();
|
||||||
|
};
|
||||||
|
template <>
|
||||||
|
struct handle_type_name<list_accessor> {
|
||||||
|
static constexpr auto name = const_name<list_accessor>();
|
||||||
|
};
|
||||||
|
template <>
|
||||||
|
struct handle_type_name<tuple_accessor> {
|
||||||
|
static constexpr auto name = const_name<tuple_accessor>();
|
||||||
|
};
|
||||||
|
|
||||||
template <typename type>
|
template <typename type>
|
||||||
struct pyobject_caster {
|
struct pyobject_caster {
|
||||||
@ -1464,7 +1570,8 @@ public:
|
|||||||
static_assert(args_pos == -1 || args_pos == constexpr_first<argument_is_args, Args...>(),
|
static_assert(args_pos == -1 || args_pos == constexpr_first<argument_is_args, Args...>(),
|
||||||
"py::args cannot be specified more than once");
|
"py::args cannot be specified more than once");
|
||||||
|
|
||||||
static constexpr auto arg_names = concat(type_descr(make_caster<Args>::name)...);
|
static constexpr auto arg_names
|
||||||
|
= ::pybind11::detail::concat(type_descr(make_caster<Args>::name)...);
|
||||||
|
|
||||||
bool load_args(function_call &call) { return load_impl_sequence(call, indices{}); }
|
bool load_args(function_call &call) { return load_impl_sequence(call, indices{}); }
|
||||||
|
|
||||||
|
@ -10,12 +10,12 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#define PYBIND11_VERSION_MAJOR 2
|
#define PYBIND11_VERSION_MAJOR 2
|
||||||
#define PYBIND11_VERSION_MINOR 12
|
#define PYBIND11_VERSION_MINOR 13
|
||||||
#define PYBIND11_VERSION_PATCH 0.dev1
|
#define PYBIND11_VERSION_PATCH 0.dev1
|
||||||
|
|
||||||
// Similar to Python's convention: https://docs.python.org/3/c-api/apiabiversion.html
|
// Similar to Python's convention: https://docs.python.org/3/c-api/apiabiversion.html
|
||||||
// Additional convention: 0xD = dev
|
// Additional convention: 0xD = dev
|
||||||
#define PYBIND11_VERSION_HEX 0x020C00D1
|
#define PYBIND11_VERSION_HEX 0x020D00D1
|
||||||
|
|
||||||
// Define some generic pybind11 helper macros for warning management.
|
// Define some generic pybind11 helper macros for warning management.
|
||||||
//
|
//
|
||||||
@ -296,6 +296,10 @@ PYBIND11_WARNING_DISABLE_MSVC(4505)
|
|||||||
# undef copysign
|
# undef copysign
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(PYBIND11_NUMPY_1_ONLY)
|
||||||
|
# define PYBIND11_INTERNAL_NUMPY_1_ONLY_DETECTED
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(PYPY_VERSION) && !defined(PYBIND11_SIMPLE_GIL_MANAGEMENT)
|
#if defined(PYPY_VERSION) && !defined(PYBIND11_SIMPLE_GIL_MANAGEMENT)
|
||||||
# define PYBIND11_SIMPLE_GIL_MANAGEMENT
|
# define PYBIND11_SIMPLE_GIL_MANAGEMENT
|
||||||
#endif
|
#endif
|
||||||
@ -921,8 +925,7 @@ using is_template_base_of
|
|||||||
= decltype(is_template_base_of_impl<Base>::check((intrinsic_t<T> *) nullptr));
|
= decltype(is_template_base_of_impl<Base>::check((intrinsic_t<T> *) nullptr));
|
||||||
#else
|
#else
|
||||||
struct is_template_base_of
|
struct is_template_base_of
|
||||||
: decltype(is_template_base_of_impl<Base>::check((intrinsic_t<T> *) nullptr)) {
|
: decltype(is_template_base_of_impl<Base>::check((intrinsic_t<T> *) nullptr)){};
|
||||||
};
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/// Check if T is an instantiation of the template `Class`. For example:
|
/// Check if T is an instantiation of the template `Class`. For example:
|
||||||
@ -1104,14 +1107,14 @@ struct overload_cast_impl {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename Return, typename Class>
|
template <typename Return, typename Class>
|
||||||
constexpr auto operator()(Return (Class::*pmf)(Args...), std::false_type = {}) const noexcept
|
constexpr auto operator()(Return (Class::*pmf)(Args...),
|
||||||
-> decltype(pmf) {
|
std::false_type = {}) const noexcept -> decltype(pmf) {
|
||||||
return pmf;
|
return pmf;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Return, typename Class>
|
template <typename Return, typename Class>
|
||||||
constexpr auto operator()(Return (Class::*pmf)(Args...) const, std::true_type) const noexcept
|
constexpr auto operator()(Return (Class::*pmf)(Args...) const,
|
||||||
-> decltype(pmf) {
|
std::true_type) const noexcept -> decltype(pmf) {
|
||||||
return pmf;
|
return pmf;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -156,8 +156,9 @@ constexpr auto concat(const descr<N, Ts...> &d, const Args &...args) {
|
|||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
template <size_t N, typename... Ts, typename... Args>
|
template <size_t N, typename... Ts, typename... Args>
|
||||||
constexpr auto concat(const descr<N, Ts...> &d, const Args &...args)
|
constexpr auto concat(const descr<N, Ts...> &d,
|
||||||
-> decltype(std::declval<descr<N + 2, Ts...>>() + concat(args...)) {
|
const Args &...args) -> decltype(std::declval<descr<N + 2, Ts...>>()
|
||||||
|
+ concat(args...)) {
|
||||||
return d + const_name(", ") + concat(args...);
|
return d + const_name(", ") + concat(args...);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -67,9 +67,14 @@ inline PyObject *make_object_base_type(PyTypeObject *metaclass);
|
|||||||
// `Py_LIMITED_API` anyway.
|
// `Py_LIMITED_API` anyway.
|
||||||
# if PYBIND11_INTERNALS_VERSION > 4
|
# if PYBIND11_INTERNALS_VERSION > 4
|
||||||
# define PYBIND11_TLS_KEY_REF Py_tss_t &
|
# define PYBIND11_TLS_KEY_REF Py_tss_t &
|
||||||
# if defined(__GNUC__) && !defined(__INTEL_COMPILER)
|
# if defined(__clang__)
|
||||||
// Clang on macOS warns due to `Py_tss_NEEDS_INIT` not specifying an initializer
|
# define PYBIND11_TLS_KEY_INIT(var) \
|
||||||
// for every field.
|
_Pragma("clang diagnostic push") /**/ \
|
||||||
|
_Pragma("clang diagnostic ignored \"-Wmissing-field-initializers\"") /**/ \
|
||||||
|
Py_tss_t var \
|
||||||
|
= Py_tss_NEEDS_INIT; \
|
||||||
|
_Pragma("clang diagnostic pop")
|
||||||
|
# elif defined(__GNUC__) && !defined(__INTEL_COMPILER)
|
||||||
# define PYBIND11_TLS_KEY_INIT(var) \
|
# define PYBIND11_TLS_KEY_INIT(var) \
|
||||||
_Pragma("GCC diagnostic push") /**/ \
|
_Pragma("GCC diagnostic push") /**/ \
|
||||||
_Pragma("GCC diagnostic ignored \"-Wmissing-field-initializers\"") /**/ \
|
_Pragma("GCC diagnostic ignored \"-Wmissing-field-initializers\"") /**/ \
|
||||||
@ -313,13 +318,13 @@ struct type_info {
|
|||||||
|
|
||||||
#define PYBIND11_INTERNALS_ID \
|
#define PYBIND11_INTERNALS_ID \
|
||||||
"__pybind11_internals_v" PYBIND11_TOSTRING(PYBIND11_INTERNALS_VERSION) \
|
"__pybind11_internals_v" PYBIND11_TOSTRING(PYBIND11_INTERNALS_VERSION) \
|
||||||
PYBIND11_INTERNALS_KIND PYBIND11_COMPILER_TYPE PYBIND11_STDLIB PYBIND11_BUILD_ABI \
|
PYBIND11_INTERNALS_KIND PYBIND11_COMPILER_TYPE PYBIND11_STDLIB \
|
||||||
PYBIND11_BUILD_TYPE "__"
|
PYBIND11_BUILD_ABI PYBIND11_BUILD_TYPE "__"
|
||||||
|
|
||||||
#define PYBIND11_MODULE_LOCAL_ID \
|
#define PYBIND11_MODULE_LOCAL_ID \
|
||||||
"__pybind11_module_local_v" PYBIND11_TOSTRING(PYBIND11_INTERNALS_VERSION) \
|
"__pybind11_module_local_v" PYBIND11_TOSTRING(PYBIND11_INTERNALS_VERSION) \
|
||||||
PYBIND11_INTERNALS_KIND PYBIND11_COMPILER_TYPE PYBIND11_STDLIB PYBIND11_BUILD_ABI \
|
PYBIND11_INTERNALS_KIND PYBIND11_COMPILER_TYPE PYBIND11_STDLIB \
|
||||||
PYBIND11_BUILD_TYPE "__"
|
PYBIND11_BUILD_ABI PYBIND11_BUILD_TYPE "__"
|
||||||
|
|
||||||
/// Each module locally stores a pointer to the `internals` data. The data
|
/// Each module locally stores a pointer to the `internals` data. The data
|
||||||
/// itself is shared among modules with the same `PYBIND11_INTERNALS_ID`.
|
/// itself is shared among modules with the same `PYBIND11_INTERNALS_ID`.
|
||||||
|
@ -1184,14 +1184,14 @@ protected:
|
|||||||
does not have a private operator new implementation. A comma operator is used in the
|
does not have a private operator new implementation. A comma operator is used in the
|
||||||
decltype argument to apply SFINAE to the public copy/move constructors.*/
|
decltype argument to apply SFINAE to the public copy/move constructors.*/
|
||||||
template <typename T, typename = enable_if_t<is_copy_constructible<T>::value>>
|
template <typename T, typename = enable_if_t<is_copy_constructible<T>::value>>
|
||||||
static auto make_copy_constructor(const T *)
|
static auto make_copy_constructor(const T *) -> decltype(new T(std::declval<const T>()),
|
||||||
-> decltype(new T(std::declval<const T>()), Constructor{}) {
|
Constructor{}) {
|
||||||
return [](const void *arg) -> void * { return new T(*reinterpret_cast<const T *>(arg)); };
|
return [](const void *arg) -> void * { return new T(*reinterpret_cast<const T *>(arg)); };
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T, typename = enable_if_t<is_move_constructible<T>::value>>
|
template <typename T, typename = enable_if_t<is_move_constructible<T>::value>>
|
||||||
static auto make_move_constructor(const T *)
|
static auto make_move_constructor(const T *) -> decltype(new T(std::declval<T &&>()),
|
||||||
-> decltype(new T(std::declval<T &&>()), Constructor{}) {
|
Constructor{}) {
|
||||||
return [](const void *arg) -> void * {
|
return [](const void *arg) -> void * {
|
||||||
return new T(std::move(*const_cast<T *>(reinterpret_cast<const T *>(arg))));
|
return new T(std::move(*const_cast<T *>(reinterpret_cast<const T *>(arg))));
|
||||||
};
|
};
|
||||||
@ -1201,13 +1201,17 @@ protected:
|
|||||||
static Constructor make_move_constructor(...) { return nullptr; }
|
static Constructor make_move_constructor(...) { return nullptr; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
inline std::string quote_cpp_type_name(const std::string &cpp_type_name) {
|
||||||
|
return cpp_type_name; // No-op for now. See PR #4888
|
||||||
|
}
|
||||||
|
|
||||||
PYBIND11_NOINLINE std::string type_info_description(const std::type_info &ti) {
|
PYBIND11_NOINLINE std::string type_info_description(const std::type_info &ti) {
|
||||||
if (auto *type_data = get_type_info(ti)) {
|
if (auto *type_data = get_type_info(ti)) {
|
||||||
handle th((PyObject *) type_data->type);
|
handle th((PyObject *) type_data->type);
|
||||||
return th.attr("__module__").cast<std::string>() + '.'
|
return th.attr("__module__").cast<std::string>() + '.'
|
||||||
+ th.attr("__qualname__").cast<std::string>();
|
+ th.attr("__qualname__").cast<std::string>();
|
||||||
}
|
}
|
||||||
return clean_type_id(ti.name());
|
return quote_cpp_type_name(clean_type_id(ti.name()));
|
||||||
}
|
}
|
||||||
|
|
||||||
PYBIND11_NAMESPACE_END(detail)
|
PYBIND11_NAMESPACE_END(detail)
|
||||||
|
@ -70,7 +70,7 @@ struct eigen_tensor_helper<Eigen::Tensor<Scalar_, NumIndices_, Options_, IndexTy
|
|||||||
|
|
||||||
template <size_t... Is>
|
template <size_t... Is>
|
||||||
struct helper<index_sequence<Is...>> {
|
struct helper<index_sequence<Is...>> {
|
||||||
static constexpr auto value = concat(const_name(((void) Is, "?"))...);
|
static constexpr auto value = ::pybind11::detail::concat(const_name(((void) Is, "?"))...);
|
||||||
};
|
};
|
||||||
|
|
||||||
static constexpr auto dimensions_descriptor
|
static constexpr auto dimensions_descriptor
|
||||||
@ -104,7 +104,8 @@ struct eigen_tensor_helper<
|
|||||||
return get_shape() == shape;
|
return get_shape() == shape;
|
||||||
}
|
}
|
||||||
|
|
||||||
static constexpr auto dimensions_descriptor = concat(const_name<Indices>()...);
|
static constexpr auto dimensions_descriptor
|
||||||
|
= ::pybind11::detail::concat(const_name<Indices>()...);
|
||||||
|
|
||||||
template <typename... Args>
|
template <typename... Args>
|
||||||
static Type *alloc(Args &&...args) {
|
static Type *alloc(Args &&...args) {
|
||||||
|
@ -128,7 +128,8 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
PYBIND11_TYPE_CASTER(type,
|
PYBIND11_TYPE_CASTER(type,
|
||||||
const_name("Callable[[") + concat(make_caster<Args>::name...)
|
const_name("Callable[[")
|
||||||
|
+ ::pybind11::detail::concat(make_caster<Args>::name...)
|
||||||
+ const_name("], ") + make_caster<retval_type>::name
|
+ const_name("], ") + make_caster<retval_type>::name
|
||||||
+ const_name("]"));
|
+ const_name("]"));
|
||||||
};
|
};
|
||||||
|
@ -29,10 +29,15 @@
|
|||||||
#include <utility>
|
#include <utility>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
#if defined(PYBIND11_NUMPY_1_ONLY) && !defined(PYBIND11_INTERNAL_NUMPY_1_ONLY_DETECTED)
|
||||||
|
# error PYBIND11_NUMPY_1_ONLY must be defined before any pybind11 header is included.
|
||||||
|
#endif
|
||||||
|
|
||||||
/* This will be true on all flat address space platforms and allows us to reduce the
|
/* This will be true on all flat address space platforms and allows us to reduce the
|
||||||
whole npy_intp / ssize_t / Py_intptr_t business down to just ssize_t for all size
|
whole npy_intp / ssize_t / Py_intptr_t business down to just ssize_t for all size
|
||||||
and dimension types (e.g. shape, strides, indexing), instead of inflicting this
|
and dimension types (e.g. shape, strides, indexing), instead of inflicting this
|
||||||
upon the library user. */
|
upon the library user.
|
||||||
|
Note that NumPy 2 now uses ssize_t for `npy_intp` to simplify this. */
|
||||||
static_assert(sizeof(::pybind11::ssize_t) == sizeof(Py_intptr_t), "ssize_t != Py_intptr_t");
|
static_assert(sizeof(::pybind11::ssize_t) == sizeof(Py_intptr_t), "ssize_t != Py_intptr_t");
|
||||||
static_assert(std::is_signed<Py_intptr_t>::value, "Py_intptr_t must be signed");
|
static_assert(std::is_signed<Py_intptr_t>::value, "Py_intptr_t must be signed");
|
||||||
// We now can reinterpret_cast between py::ssize_t and Py_intptr_t (MSVC + PyPy cares)
|
// We now can reinterpret_cast between py::ssize_t and Py_intptr_t (MSVC + PyPy cares)
|
||||||
@ -41,10 +46,16 @@ PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
|
|||||||
|
|
||||||
PYBIND11_WARNING_DISABLE_MSVC(4127)
|
PYBIND11_WARNING_DISABLE_MSVC(4127)
|
||||||
|
|
||||||
|
class dtype; // Forward declaration
|
||||||
class array; // Forward declaration
|
class array; // Forward declaration
|
||||||
|
|
||||||
PYBIND11_NAMESPACE_BEGIN(detail)
|
PYBIND11_NAMESPACE_BEGIN(detail)
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct handle_type_name<dtype> {
|
||||||
|
static constexpr auto name = const_name("numpy.dtype");
|
||||||
|
};
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
struct handle_type_name<array> {
|
struct handle_type_name<array> {
|
||||||
static constexpr auto name = const_name("numpy.ndarray");
|
static constexpr auto name = const_name("numpy.ndarray");
|
||||||
@ -53,7 +64,8 @@ struct handle_type_name<array> {
|
|||||||
template <typename type, typename SFINAE = void>
|
template <typename type, typename SFINAE = void>
|
||||||
struct npy_format_descriptor;
|
struct npy_format_descriptor;
|
||||||
|
|
||||||
struct PyArrayDescr_Proxy {
|
/* NumPy 1 proxy (always includes legacy fields) */
|
||||||
|
struct PyArrayDescr1_Proxy {
|
||||||
PyObject_HEAD
|
PyObject_HEAD
|
||||||
PyObject *typeobj;
|
PyObject *typeobj;
|
||||||
char kind;
|
char kind;
|
||||||
@ -68,6 +80,43 @@ struct PyArrayDescr_Proxy {
|
|||||||
PyObject *names;
|
PyObject *names;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifndef PYBIND11_NUMPY_1_ONLY
|
||||||
|
struct PyArrayDescr_Proxy {
|
||||||
|
PyObject_HEAD
|
||||||
|
PyObject *typeobj;
|
||||||
|
char kind;
|
||||||
|
char type;
|
||||||
|
char byteorder;
|
||||||
|
char _former_flags;
|
||||||
|
int type_num;
|
||||||
|
/* Additional fields are NumPy version specific. */
|
||||||
|
};
|
||||||
|
#else
|
||||||
|
/* NumPy 1.x only, we can expose all fields */
|
||||||
|
using PyArrayDescr_Proxy = PyArrayDescr1_Proxy;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* NumPy 2 proxy, including legacy fields */
|
||||||
|
struct PyArrayDescr2_Proxy {
|
||||||
|
PyObject_HEAD
|
||||||
|
PyObject *typeobj;
|
||||||
|
char kind;
|
||||||
|
char type;
|
||||||
|
char byteorder;
|
||||||
|
char _former_flags;
|
||||||
|
int type_num;
|
||||||
|
std::uint64_t flags;
|
||||||
|
ssize_t elsize;
|
||||||
|
ssize_t alignment;
|
||||||
|
PyObject *metadata;
|
||||||
|
Py_hash_t hash;
|
||||||
|
void *reserved_null[2];
|
||||||
|
/* The following fields only exist if 0 <= type_num < 2056 */
|
||||||
|
char *subarray;
|
||||||
|
PyObject *fields;
|
||||||
|
PyObject *names;
|
||||||
|
};
|
||||||
|
|
||||||
struct PyArray_Proxy {
|
struct PyArray_Proxy {
|
||||||
PyObject_HEAD
|
PyObject_HEAD
|
||||||
char *data;
|
char *data;
|
||||||
@ -131,6 +180,14 @@ PYBIND11_NOINLINE module_ import_numpy_core_submodule(const char *submodule_name
|
|||||||
object numpy_version = numpy_lib.attr("NumpyVersion")(version_string);
|
object numpy_version = numpy_lib.attr("NumpyVersion")(version_string);
|
||||||
int major_version = numpy_version.attr("major").cast<int>();
|
int major_version = numpy_version.attr("major").cast<int>();
|
||||||
|
|
||||||
|
#ifdef PYBIND11_NUMPY_1_ONLY
|
||||||
|
if (major_version >= 2) {
|
||||||
|
throw std::runtime_error(
|
||||||
|
"This extension was built with PYBIND11_NUMPY_1_ONLY defined, "
|
||||||
|
"but NumPy 2 is used in this process. For NumPy2 compatibility, "
|
||||||
|
"this extension needs to be rebuilt without the PYBIND11_NUMPY_1_ONLY define.");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
/* `numpy.core` was renamed to `numpy._core` in NumPy 2.0 as it officially
|
/* `numpy.core` was renamed to `numpy._core` in NumPy 2.0 as it officially
|
||||||
became a private module. */
|
became a private module. */
|
||||||
std::string numpy_core_path = major_version >= 2 ? "numpy._core" : "numpy.core";
|
std::string numpy_core_path = major_version >= 2 ? "numpy._core" : "numpy.core";
|
||||||
@ -203,6 +260,8 @@ struct npy_api {
|
|||||||
NPY_ULONG_, NPY_ULONGLONG_, NPY_UINT_),
|
NPY_ULONG_, NPY_ULONGLONG_, NPY_UINT_),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
unsigned int PyArray_RUNTIME_VERSION_;
|
||||||
|
|
||||||
struct PyArray_Dims {
|
struct PyArray_Dims {
|
||||||
Py_intptr_t *ptr;
|
Py_intptr_t *ptr;
|
||||||
int len;
|
int len;
|
||||||
@ -241,6 +300,7 @@ struct npy_api {
|
|||||||
PyObject *(*PyArray_FromAny_)(PyObject *, PyObject *, int, int, int, PyObject *);
|
PyObject *(*PyArray_FromAny_)(PyObject *, PyObject *, int, int, int, PyObject *);
|
||||||
int (*PyArray_DescrConverter_)(PyObject *, PyObject **);
|
int (*PyArray_DescrConverter_)(PyObject *, PyObject **);
|
||||||
bool (*PyArray_EquivTypes_)(PyObject *, PyObject *);
|
bool (*PyArray_EquivTypes_)(PyObject *, PyObject *);
|
||||||
|
#ifdef PYBIND11_NUMPY_1_ONLY
|
||||||
int (*PyArray_GetArrayParamsFromObject_)(PyObject *,
|
int (*PyArray_GetArrayParamsFromObject_)(PyObject *,
|
||||||
PyObject *,
|
PyObject *,
|
||||||
unsigned char,
|
unsigned char,
|
||||||
@ -249,6 +309,7 @@ struct npy_api {
|
|||||||
Py_intptr_t *,
|
Py_intptr_t *,
|
||||||
PyObject **,
|
PyObject **,
|
||||||
PyObject *);
|
PyObject *);
|
||||||
|
#endif
|
||||||
PyObject *(*PyArray_Squeeze_)(PyObject *);
|
PyObject *(*PyArray_Squeeze_)(PyObject *);
|
||||||
// Unused. Not removed because that affects ABI of the class.
|
// Unused. Not removed because that affects ABI of the class.
|
||||||
int (*PyArray_SetBaseObject_)(PyObject *, PyObject *);
|
int (*PyArray_SetBaseObject_)(PyObject *, PyObject *);
|
||||||
@ -266,7 +327,8 @@ private:
|
|||||||
API_PyArray_DescrFromScalar = 57,
|
API_PyArray_DescrFromScalar = 57,
|
||||||
API_PyArray_FromAny = 69,
|
API_PyArray_FromAny = 69,
|
||||||
API_PyArray_Resize = 80,
|
API_PyArray_Resize = 80,
|
||||||
API_PyArray_CopyInto = 82,
|
// CopyInto was slot 82 and 50 was effectively an alias. NumPy 2 removed 82.
|
||||||
|
API_PyArray_CopyInto = 50,
|
||||||
API_PyArray_NewCopy = 85,
|
API_PyArray_NewCopy = 85,
|
||||||
API_PyArray_NewFromDescr = 94,
|
API_PyArray_NewFromDescr = 94,
|
||||||
API_PyArray_DescrNewFromType = 96,
|
API_PyArray_DescrNewFromType = 96,
|
||||||
@ -275,7 +337,9 @@ private:
|
|||||||
API_PyArray_View = 137,
|
API_PyArray_View = 137,
|
||||||
API_PyArray_DescrConverter = 174,
|
API_PyArray_DescrConverter = 174,
|
||||||
API_PyArray_EquivTypes = 182,
|
API_PyArray_EquivTypes = 182,
|
||||||
|
#ifdef PYBIND11_NUMPY_1_ONLY
|
||||||
API_PyArray_GetArrayParamsFromObject = 278,
|
API_PyArray_GetArrayParamsFromObject = 278,
|
||||||
|
#endif
|
||||||
API_PyArray_SetBaseObject = 282
|
API_PyArray_SetBaseObject = 282
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -290,7 +354,8 @@ private:
|
|||||||
npy_api api;
|
npy_api api;
|
||||||
#define DECL_NPY_API(Func) api.Func##_ = (decltype(api.Func##_)) api_ptr[API_##Func];
|
#define DECL_NPY_API(Func) api.Func##_ = (decltype(api.Func##_)) api_ptr[API_##Func];
|
||||||
DECL_NPY_API(PyArray_GetNDArrayCFeatureVersion);
|
DECL_NPY_API(PyArray_GetNDArrayCFeatureVersion);
|
||||||
if (api.PyArray_GetNDArrayCFeatureVersion_() < 0x7) {
|
api.PyArray_RUNTIME_VERSION_ = api.PyArray_GetNDArrayCFeatureVersion_();
|
||||||
|
if (api.PyArray_RUNTIME_VERSION_ < 0x7) {
|
||||||
pybind11_fail("pybind11 numpy support requires numpy >= 1.7.0");
|
pybind11_fail("pybind11 numpy support requires numpy >= 1.7.0");
|
||||||
}
|
}
|
||||||
DECL_NPY_API(PyArray_Type);
|
DECL_NPY_API(PyArray_Type);
|
||||||
@ -309,7 +374,9 @@ private:
|
|||||||
DECL_NPY_API(PyArray_View);
|
DECL_NPY_API(PyArray_View);
|
||||||
DECL_NPY_API(PyArray_DescrConverter);
|
DECL_NPY_API(PyArray_DescrConverter);
|
||||||
DECL_NPY_API(PyArray_EquivTypes);
|
DECL_NPY_API(PyArray_EquivTypes);
|
||||||
|
#ifdef PYBIND11_NUMPY_1_ONLY
|
||||||
DECL_NPY_API(PyArray_GetArrayParamsFromObject);
|
DECL_NPY_API(PyArray_GetArrayParamsFromObject);
|
||||||
|
#endif
|
||||||
DECL_NPY_API(PyArray_SetBaseObject);
|
DECL_NPY_API(PyArray_SetBaseObject);
|
||||||
|
|
||||||
#undef DECL_NPY_API
|
#undef DECL_NPY_API
|
||||||
@ -331,6 +398,14 @@ inline const PyArrayDescr_Proxy *array_descriptor_proxy(const PyObject *ptr) {
|
|||||||
return reinterpret_cast<const PyArrayDescr_Proxy *>(ptr);
|
return reinterpret_cast<const PyArrayDescr_Proxy *>(ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline const PyArrayDescr1_Proxy *array_descriptor1_proxy(const PyObject *ptr) {
|
||||||
|
return reinterpret_cast<const PyArrayDescr1_Proxy *>(ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline const PyArrayDescr2_Proxy *array_descriptor2_proxy(const PyObject *ptr) {
|
||||||
|
return reinterpret_cast<const PyArrayDescr2_Proxy *>(ptr);
|
||||||
|
}
|
||||||
|
|
||||||
inline bool check_flags(const void *ptr, int flag) {
|
inline bool check_flags(const void *ptr, int flag) {
|
||||||
return (flag == (array_proxy(ptr)->flags & flag));
|
return (flag == (array_proxy(ptr)->flags & flag));
|
||||||
}
|
}
|
||||||
@ -371,7 +446,7 @@ struct array_info<std::array<T, N>> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static constexpr auto extents = const_name<array_info<T>::is_array>(
|
static constexpr auto extents = const_name<array_info<T>::is_array>(
|
||||||
concat(const_name<N>(), array_info<T>::extents), const_name<N>());
|
::pybind11::detail::concat(const_name<N>(), array_info<T>::extents), const_name<N>());
|
||||||
};
|
};
|
||||||
// For numpy we have special handling for arrays of characters, so we don't include
|
// For numpy we have special handling for arrays of characters, so we don't include
|
||||||
// the size in the array extents.
|
// the size in the array extents.
|
||||||
@ -610,10 +685,32 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Size of the data type in bytes.
|
/// Size of the data type in bytes.
|
||||||
|
#ifdef PYBIND11_NUMPY_1_ONLY
|
||||||
ssize_t itemsize() const { return detail::array_descriptor_proxy(m_ptr)->elsize; }
|
ssize_t itemsize() const { return detail::array_descriptor_proxy(m_ptr)->elsize; }
|
||||||
|
#else
|
||||||
|
ssize_t itemsize() const {
|
||||||
|
if (detail::npy_api::get().PyArray_RUNTIME_VERSION_ < 0x12) {
|
||||||
|
return detail::array_descriptor1_proxy(m_ptr)->elsize;
|
||||||
|
}
|
||||||
|
return detail::array_descriptor2_proxy(m_ptr)->elsize;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/// Returns true for structured data types.
|
/// Returns true for structured data types.
|
||||||
|
#ifdef PYBIND11_NUMPY_1_ONLY
|
||||||
bool has_fields() const { return detail::array_descriptor_proxy(m_ptr)->names != nullptr; }
|
bool has_fields() const { return detail::array_descriptor_proxy(m_ptr)->names != nullptr; }
|
||||||
|
#else
|
||||||
|
bool has_fields() const {
|
||||||
|
if (detail::npy_api::get().PyArray_RUNTIME_VERSION_ < 0x12) {
|
||||||
|
return detail::array_descriptor1_proxy(m_ptr)->names != nullptr;
|
||||||
|
}
|
||||||
|
const auto *proxy = detail::array_descriptor2_proxy(m_ptr);
|
||||||
|
if (proxy->type_num < 0 || proxy->type_num >= 2056) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return proxy->names != nullptr;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/// Single-character code for dtype's kind.
|
/// Single-character code for dtype's kind.
|
||||||
/// For example, floating point types are 'f' and integral types are 'i'.
|
/// For example, floating point types are 'f' and integral types are 'i'.
|
||||||
@ -639,11 +736,29 @@ public:
|
|||||||
/// Single character for byteorder
|
/// Single character for byteorder
|
||||||
char byteorder() const { return detail::array_descriptor_proxy(m_ptr)->byteorder; }
|
char byteorder() const { return detail::array_descriptor_proxy(m_ptr)->byteorder; }
|
||||||
|
|
||||||
/// Alignment of the data type
|
/// Alignment of the data type
|
||||||
|
#ifdef PYBIND11_NUMPY_1_ONLY
|
||||||
int alignment() const { return detail::array_descriptor_proxy(m_ptr)->alignment; }
|
int alignment() const { return detail::array_descriptor_proxy(m_ptr)->alignment; }
|
||||||
|
#else
|
||||||
|
ssize_t alignment() const {
|
||||||
|
if (detail::npy_api::get().PyArray_RUNTIME_VERSION_ < 0x12) {
|
||||||
|
return detail::array_descriptor1_proxy(m_ptr)->alignment;
|
||||||
|
}
|
||||||
|
return detail::array_descriptor2_proxy(m_ptr)->alignment;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/// Flags for the array descriptor
|
/// Flags for the array descriptor
|
||||||
|
#ifdef PYBIND11_NUMPY_1_ONLY
|
||||||
char flags() const { return detail::array_descriptor_proxy(m_ptr)->flags; }
|
char flags() const { return detail::array_descriptor_proxy(m_ptr)->flags; }
|
||||||
|
#else
|
||||||
|
std::uint64_t flags() const {
|
||||||
|
if (detail::npy_api::get().PyArray_RUNTIME_VERSION_ < 0x12) {
|
||||||
|
return (unsigned char) detail::array_descriptor1_proxy(m_ptr)->flags;
|
||||||
|
}
|
||||||
|
return detail::array_descriptor2_proxy(m_ptr)->flags;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static object &_dtype_from_pep3118() {
|
static object &_dtype_from_pep3118() {
|
||||||
@ -810,9 +925,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Byte size of a single element
|
/// Byte size of a single element
|
||||||
ssize_t itemsize() const {
|
ssize_t itemsize() const { return dtype().itemsize(); }
|
||||||
return detail::array_descriptor_proxy(detail::array_proxy(m_ptr)->descr)->elsize;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Total number of bytes
|
/// Total number of bytes
|
||||||
ssize_t nbytes() const { return size() * itemsize(); }
|
ssize_t nbytes() const { return size() * itemsize(); }
|
||||||
|
@ -492,9 +492,7 @@ protected:
|
|||||||
signature += rec->scope.attr("__module__").cast<std::string>() + "."
|
signature += rec->scope.attr("__module__").cast<std::string>() + "."
|
||||||
+ rec->scope.attr("__qualname__").cast<std::string>();
|
+ rec->scope.attr("__qualname__").cast<std::string>();
|
||||||
} else {
|
} else {
|
||||||
std::string tname(t->name());
|
signature += detail::quote_cpp_type_name(detail::clean_type_id(t->name()));
|
||||||
detail::clean_type_id(tname);
|
|
||||||
signature += tname;
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
signature += c;
|
signature += c;
|
||||||
@ -1192,6 +1190,15 @@ protected:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
PYBIND11_NAMESPACE_BEGIN(detail)
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct handle_type_name<cpp_function> {
|
||||||
|
static constexpr auto name = const_name("Callable");
|
||||||
|
};
|
||||||
|
|
||||||
|
PYBIND11_NAMESPACE_END(detail)
|
||||||
|
|
||||||
/// Wrapper for Python extension modules
|
/// Wrapper for Python extension modules
|
||||||
class module_ : public object {
|
class module_ : public object {
|
||||||
public:
|
public:
|
||||||
@ -1319,6 +1326,15 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
PYBIND11_NAMESPACE_BEGIN(detail)
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct handle_type_name<module_> {
|
||||||
|
static constexpr auto name = const_name("module");
|
||||||
|
};
|
||||||
|
|
||||||
|
PYBIND11_NAMESPACE_END(detail)
|
||||||
|
|
||||||
// When inside a namespace (or anywhere as long as it's not the first item on a line),
|
// When inside a namespace (or anywhere as long as it's not the first item on a line),
|
||||||
// C++20 allows "module" to be used. This is provided for backward compatibility, and for
|
// C++20 allows "module" to be used. This is provided for backward compatibility, and for
|
||||||
// simplicity, if someone wants to use py::module for example, that is perfectly safe.
|
// simplicity, if someone wants to use py::module for example, that is perfectly safe.
|
||||||
@ -2611,6 +2627,11 @@ public:
|
|||||||
|
|
||||||
PYBIND11_NAMESPACE_BEGIN(detail)
|
PYBIND11_NAMESPACE_BEGIN(detail)
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct handle_type_name<exception<void>> {
|
||||||
|
static constexpr auto name = const_name("Exception");
|
||||||
|
};
|
||||||
|
|
||||||
// Helper function for register_exception and register_local_exception
|
// Helper function for register_exception and register_local_exception
|
||||||
template <typename CppException>
|
template <typename CppException>
|
||||||
exception<CppException> &
|
exception<CppException> &
|
||||||
|
@ -59,6 +59,7 @@ struct sequence_item;
|
|||||||
struct list_item;
|
struct list_item;
|
||||||
struct tuple_item;
|
struct tuple_item;
|
||||||
} // namespace accessor_policies
|
} // namespace accessor_policies
|
||||||
|
// PLEASE KEEP handle_type_name SPECIALIZATIONS IN SYNC.
|
||||||
using obj_attr_accessor = accessor<accessor_policies::obj_attr>;
|
using obj_attr_accessor = accessor<accessor_policies::obj_attr>;
|
||||||
using str_attr_accessor = accessor<accessor_policies::str_attr>;
|
using str_attr_accessor = accessor<accessor_policies::str_attr>;
|
||||||
using item_accessor = accessor<accessor_policies::generic_item>;
|
using item_accessor = accessor<accessor_policies::generic_item>;
|
||||||
|
@ -421,7 +421,8 @@ struct variant_caster<V<Ts...>> {
|
|||||||
|
|
||||||
using Type = V<Ts...>;
|
using Type = V<Ts...>;
|
||||||
PYBIND11_TYPE_CASTER(Type,
|
PYBIND11_TYPE_CASTER(Type,
|
||||||
const_name("Union[") + detail::concat(make_caster<Ts>::name...)
|
const_name("Union[")
|
||||||
|
+ ::pybind11::detail::concat(make_caster<Ts>::name...)
|
||||||
+ const_name("]"));
|
+ const_name("]"));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -158,8 +158,7 @@ void vector_modifiers(
|
|||||||
return v.release();
|
return v.release();
|
||||||
}));
|
}));
|
||||||
|
|
||||||
cl.def(
|
cl.def("clear", [](Vector &v) { v.clear(); }, "Clear the contents");
|
||||||
"clear", [](Vector &v) { v.clear(); }, "Clear the contents");
|
|
||||||
|
|
||||||
cl.def(
|
cl.def(
|
||||||
"extend",
|
"extend",
|
||||||
|
@ -69,8 +69,9 @@ PYBIND11_NAMESPACE_BEGIN(detail)
|
|||||||
|
|
||||||
template <typename... Types>
|
template <typename... Types>
|
||||||
struct handle_type_name<typing::Tuple<Types...>> {
|
struct handle_type_name<typing::Tuple<Types...>> {
|
||||||
static constexpr auto name
|
static constexpr auto name = const_name("tuple[")
|
||||||
= const_name("tuple[") + concat(make_caster<Types>::name...) + const_name("]");
|
+ ::pybind11::detail::concat(make_caster<Types>::name...)
|
||||||
|
+ const_name("]");
|
||||||
};
|
};
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
@ -79,6 +80,13 @@ struct handle_type_name<typing::Tuple<>> {
|
|||||||
static constexpr auto name = const_name("tuple[()]");
|
static constexpr auto name = const_name("tuple[()]");
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
struct handle_type_name<typing::Tuple<T, ellipsis>> {
|
||||||
|
// PEP 484 specifies this syntax for a variable-length tuple
|
||||||
|
static constexpr auto name
|
||||||
|
= const_name("tuple[") + make_caster<T>::name + const_name(", ...]");
|
||||||
|
};
|
||||||
|
|
||||||
template <typename K, typename V>
|
template <typename K, typename V>
|
||||||
struct handle_type_name<typing::Dict<K, V>> {
|
struct handle_type_name<typing::Dict<K, V>> {
|
||||||
static constexpr auto name = const_name("dict[") + make_caster<K>::name + const_name(", ")
|
static constexpr auto name = const_name("dict[") + make_caster<K>::name + const_name(", ")
|
||||||
@ -108,9 +116,9 @@ struct handle_type_name<typing::Iterator<T>> {
|
|||||||
template <typename Return, typename... Args>
|
template <typename Return, typename... Args>
|
||||||
struct handle_type_name<typing::Callable<Return(Args...)>> {
|
struct handle_type_name<typing::Callable<Return(Args...)>> {
|
||||||
using retval_type = conditional_t<std::is_same<Return, void>::value, void_type, Return>;
|
using retval_type = conditional_t<std::is_same<Return, void>::value, void_type, Return>;
|
||||||
static constexpr auto name = const_name("Callable[[") + concat(make_caster<Args>::name...)
|
static constexpr auto name
|
||||||
+ const_name("], ") + make_caster<retval_type>::name
|
= const_name("Callable[[") + ::pybind11::detail::concat(make_caster<Args>::name...)
|
||||||
+ const_name("]");
|
+ const_name("], ") + make_caster<retval_type>::name + const_name("]");
|
||||||
};
|
};
|
||||||
|
|
||||||
PYBIND11_NAMESPACE_END(detail)
|
PYBIND11_NAMESPACE_END(detail)
|
||||||
|
@ -8,5 +8,5 @@ def _to_int(s: str) -> Union[int, str]:
|
|||||||
return s
|
return s
|
||||||
|
|
||||||
|
|
||||||
__version__ = "2.12.0.dev1"
|
__version__ = "2.13.0.dev1"
|
||||||
version_info = tuple(_to_int(s) for s in __version__.split("."))
|
version_info = tuple(_to_int(s) for s in __version__.split("."))
|
||||||
|
@ -353,7 +353,7 @@ CCompilerMethod = Callable[
|
|||||||
distutils.ccompiler.CCompiler,
|
distutils.ccompiler.CCompiler,
|
||||||
List[str],
|
List[str],
|
||||||
Optional[str],
|
Optional[str],
|
||||||
Optional[Union[Tuple[str], Tuple[str, Optional[str]]]],
|
Optional[List[Union[Tuple[str], Tuple[str, Optional[str]]]]],
|
||||||
Optional[List[str]],
|
Optional[List[str]],
|
||||||
bool,
|
bool,
|
||||||
Optional[List[str]],
|
Optional[List[str]],
|
||||||
@ -429,7 +429,7 @@ class ParallelCompile:
|
|||||||
compiler: distutils.ccompiler.CCompiler,
|
compiler: distutils.ccompiler.CCompiler,
|
||||||
sources: List[str],
|
sources: List[str],
|
||||||
output_dir: Optional[str] = None,
|
output_dir: Optional[str] = None,
|
||||||
macros: Optional[Union[Tuple[str], Tuple[str, Optional[str]]]] = None,
|
macros: Optional[List[Union[Tuple[str], Tuple[str, Optional[str]]]]] = None,
|
||||||
include_dirs: Optional[List[str]] = None,
|
include_dirs: Optional[List[str]] = None,
|
||||||
debug: bool = False,
|
debug: bool = False,
|
||||||
extra_preargs: Optional[List[str]] = None,
|
extra_preargs: Optional[List[str]] = None,
|
||||||
|
@ -19,7 +19,7 @@ ignore = [
|
|||||||
|
|
||||||
[tool.mypy]
|
[tool.mypy]
|
||||||
files = ["pybind11"]
|
files = ["pybind11"]
|
||||||
python_version = "3.7"
|
python_version = "3.8"
|
||||||
strict = true
|
strict = true
|
||||||
show_error_codes = true
|
show_error_codes = true
|
||||||
enable_error_code = ["ignore-without-code", "redundant-expr", "truthy-bool"]
|
enable_error_code = ["ignore-without-code", "redundant-expr", "truthy-bool"]
|
||||||
|
@ -7,13 +7,13 @@
|
|||||||
|
|
||||||
cmake_minimum_required(VERSION 3.5)
|
cmake_minimum_required(VERSION 3.5)
|
||||||
|
|
||||||
# The `cmake_minimum_required(VERSION 3.5...3.27)` syntax does not work with
|
# The `cmake_minimum_required(VERSION 3.5...3.29)` syntax does not work with
|
||||||
# some versions of VS that have a patched CMake 3.11. This forces us to emulate
|
# some versions of VS that have a patched CMake 3.11. This forces us to emulate
|
||||||
# the behavior using the following workaround:
|
# the behavior using the following workaround:
|
||||||
if(${CMAKE_VERSION} VERSION_LESS 3.27)
|
if(${CMAKE_VERSION} VERSION_LESS 3.29)
|
||||||
cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
|
cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
|
||||||
else()
|
else()
|
||||||
cmake_policy(VERSION 3.27)
|
cmake_policy(VERSION 3.29)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Filter out items; print an optional message if any items filtered. This ignores extensions.
|
# Filter out items; print an optional message if any items filtered. This ignores extensions.
|
||||||
@ -520,11 +520,15 @@ set(PYBIND11_TEST_PREFIX_COMMAND
|
|||||||
""
|
""
|
||||||
CACHE STRING "Put this before pytest, use for checkers and such")
|
CACHE STRING "Put this before pytest, use for checkers and such")
|
||||||
|
|
||||||
|
set(PYBIND11_PYTEST_ARGS
|
||||||
|
""
|
||||||
|
CACHE STRING "Extra arguments for pytest")
|
||||||
|
|
||||||
# A single command to compile and run the tests
|
# A single command to compile and run the tests
|
||||||
add_custom_target(
|
add_custom_target(
|
||||||
pytest
|
pytest
|
||||||
COMMAND ${PYBIND11_TEST_PREFIX_COMMAND} ${PYTHON_EXECUTABLE} -m pytest
|
COMMAND ${PYBIND11_TEST_PREFIX_COMMAND} ${PYTHON_EXECUTABLE} -m pytest
|
||||||
${PYBIND11_ABS_PYTEST_FILES}
|
${PYBIND11_ABS_PYTEST_FILES} ${PYBIND11_PYTEST_ARGS}
|
||||||
DEPENDS ${test_targets}
|
DEPENDS ${test_targets}
|
||||||
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
|
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
|
||||||
USES_TERMINAL)
|
USES_TERMINAL)
|
||||||
|
@ -218,4 +218,5 @@ def pytest_report_header(config):
|
|||||||
f" {pybind11_tests.cpp_std}"
|
f" {pybind11_tests.cpp_std}"
|
||||||
f" {pybind11_tests.PYBIND11_INTERNALS_ID}"
|
f" {pybind11_tests.PYBIND11_INTERNALS_ID}"
|
||||||
f" PYBIND11_SIMPLE_GIL_MANAGEMENT={pybind11_tests.PYBIND11_SIMPLE_GIL_MANAGEMENT}"
|
f" PYBIND11_SIMPLE_GIL_MANAGEMENT={pybind11_tests.PYBIND11_SIMPLE_GIL_MANAGEMENT}"
|
||||||
|
f" PYBIND11_NUMPY_1_ONLY={pybind11_tests.PYBIND11_NUMPY_1_ONLY}"
|
||||||
)
|
)
|
||||||
|
@ -80,10 +80,10 @@ PYBIND11_MODULE(pybind11_tests, m) {
|
|||||||
|
|
||||||
// Intentionally kept minimal to not create a maintenance chore
|
// Intentionally kept minimal to not create a maintenance chore
|
||||||
// ("just enough" to be conclusive).
|
// ("just enough" to be conclusive).
|
||||||
#if defined(_MSC_FULL_VER)
|
#if defined(__VERSION__)
|
||||||
m.attr("compiler_info") = "MSVC " PYBIND11_TOSTRING(_MSC_FULL_VER);
|
|
||||||
#elif defined(__VERSION__)
|
|
||||||
m.attr("compiler_info") = __VERSION__;
|
m.attr("compiler_info") = __VERSION__;
|
||||||
|
#elif defined(_MSC_FULL_VER)
|
||||||
|
m.attr("compiler_info") = "MSVC " PYBIND11_TOSTRING(_MSC_FULL_VER);
|
||||||
#else
|
#else
|
||||||
m.attr("compiler_info") = py::none();
|
m.attr("compiler_info") = py::none();
|
||||||
#endif
|
#endif
|
||||||
@ -95,6 +95,12 @@ PYBIND11_MODULE(pybind11_tests, m) {
|
|||||||
#else
|
#else
|
||||||
false;
|
false;
|
||||||
#endif
|
#endif
|
||||||
|
m.attr("PYBIND11_NUMPY_1_ONLY") =
|
||||||
|
#if defined(PYBIND11_NUMPY_1_ONLY)
|
||||||
|
true;
|
||||||
|
#else
|
||||||
|
false;
|
||||||
|
#endif
|
||||||
|
|
||||||
bind_ConstructorStats(m);
|
bind_ConstructorStats(m);
|
||||||
|
|
||||||
|
@ -95,7 +95,7 @@ TEST_SUBMODULE(builtin_casters, m) {
|
|||||||
} // 𝐀, utf16
|
} // 𝐀, utf16
|
||||||
else {
|
else {
|
||||||
wstr.push_back((wchar_t) mathbfA32);
|
wstr.push_back((wchar_t) mathbfA32);
|
||||||
} // 𝐀, utf32
|
} // 𝐀, utf32
|
||||||
wstr.push_back(0x7a); // z
|
wstr.push_back(0x7a); // z
|
||||||
|
|
||||||
m.def("good_utf8_string", []() {
|
m.def("good_utf8_string", []() {
|
||||||
@ -104,10 +104,9 @@ TEST_SUBMODULE(builtin_casters, m) {
|
|||||||
m.def("good_utf16_string", [=]() {
|
m.def("good_utf16_string", [=]() {
|
||||||
return std::u16string({b16, ib16, cake16_1, cake16_2, mathbfA16_1, mathbfA16_2, z16});
|
return std::u16string({b16, ib16, cake16_1, cake16_2, mathbfA16_1, mathbfA16_2, z16});
|
||||||
}); // b‽🎂𝐀z
|
}); // b‽🎂𝐀z
|
||||||
m.def("good_utf32_string", [=]() {
|
m.def("good_utf32_string",
|
||||||
return std::u32string({a32, mathbfA32, cake32, ib32, z32});
|
[=]() { return std::u32string({a32, mathbfA32, cake32, ib32, z32}); }); // a𝐀🎂‽z
|
||||||
}); // a𝐀🎂‽z
|
m.def("good_wchar_string", [=]() { return wstr; }); // a‽𝐀z
|
||||||
m.def("good_wchar_string", [=]() { return wstr; }); // a‽𝐀z
|
|
||||||
m.def("bad_utf8_string", []() {
|
m.def("bad_utf8_string", []() {
|
||||||
return std::string("abc\xd0"
|
return std::string("abc\xd0"
|
||||||
"def");
|
"def");
|
||||||
@ -117,9 +116,8 @@ TEST_SUBMODULE(builtin_casters, m) {
|
|||||||
// UnicodeDecodeError
|
// UnicodeDecodeError
|
||||||
m.def("bad_utf32_string", [=]() { return std::u32string({a32, char32_t(0xd800), z32}); });
|
m.def("bad_utf32_string", [=]() { return std::u32string({a32, char32_t(0xd800), z32}); });
|
||||||
if (sizeof(wchar_t) == 2) {
|
if (sizeof(wchar_t) == 2) {
|
||||||
m.def("bad_wchar_string", [=]() {
|
m.def("bad_wchar_string",
|
||||||
return std::wstring({wchar_t(0x61), wchar_t(0xd800)});
|
[=]() { return std::wstring({wchar_t(0x61), wchar_t(0xd800)}); });
|
||||||
});
|
|
||||||
}
|
}
|
||||||
m.def("u8_Z", []() -> char { return 'Z'; });
|
m.def("u8_Z", []() -> char { return 'Z'; });
|
||||||
m.def("u8_eacute", []() -> char { return '\xe9'; });
|
m.def("u8_eacute", []() -> char { return '\xe9'; });
|
||||||
@ -236,8 +234,7 @@ TEST_SUBMODULE(builtin_casters, m) {
|
|||||||
|
|
||||||
// test_int_convert
|
// test_int_convert
|
||||||
m.def("int_passthrough", [](int arg) { return arg; });
|
m.def("int_passthrough", [](int arg) { return arg; });
|
||||||
m.def(
|
m.def("int_passthrough_noconvert", [](int arg) { return arg; }, py::arg{}.noconvert());
|
||||||
"int_passthrough_noconvert", [](int arg) { return arg; }, py::arg{}.noconvert());
|
|
||||||
|
|
||||||
// test_tuple
|
// test_tuple
|
||||||
m.def(
|
m.def(
|
||||||
@ -302,8 +299,7 @@ TEST_SUBMODULE(builtin_casters, m) {
|
|||||||
|
|
||||||
// test_bool_caster
|
// test_bool_caster
|
||||||
m.def("bool_passthrough", [](bool arg) { return arg; });
|
m.def("bool_passthrough", [](bool arg) { return arg; });
|
||||||
m.def(
|
m.def("bool_passthrough_noconvert", [](bool arg) { return arg; }, py::arg{}.noconvert());
|
||||||
"bool_passthrough_noconvert", [](bool arg) { return arg; }, py::arg{}.noconvert());
|
|
||||||
|
|
||||||
// TODO: This should be disabled and fixed in future Intel compilers
|
// TODO: This should be disabled and fixed in future Intel compilers
|
||||||
#if !defined(__INTEL_COMPILER)
|
#if !defined(__INTEL_COMPILER)
|
||||||
@ -311,8 +307,7 @@ TEST_SUBMODULE(builtin_casters, m) {
|
|||||||
// When compiled with the Intel compiler, this results in segmentation faults when importing
|
// When compiled with the Intel compiler, this results in segmentation faults when importing
|
||||||
// the module. Tested with icc (ICC) 2021.1 Beta 20200827, this should be tested again when
|
// the module. Tested with icc (ICC) 2021.1 Beta 20200827, this should be tested again when
|
||||||
// a newer version of icc is available.
|
// a newer version of icc is available.
|
||||||
m.def(
|
m.def("bool_passthrough_noconvert2", [](bool arg) { return arg; }, py::arg().noconvert());
|
||||||
"bool_passthrough_noconvert2", [](bool arg) { return arg; }, py::arg().noconvert());
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// test_reference_wrapper
|
// test_reference_wrapper
|
||||||
|
@ -63,10 +63,8 @@ TEST_SUBMODULE(call_policies, m) {
|
|||||||
.def("returnNullChildKeepAliveParent", &Parent::returnNullChild, py::keep_alive<0, 1>())
|
.def("returnNullChildKeepAliveParent", &Parent::returnNullChild, py::keep_alive<0, 1>())
|
||||||
.def_static("staticFunction", &Parent::staticFunction, py::keep_alive<1, 0>());
|
.def_static("staticFunction", &Parent::staticFunction, py::keep_alive<1, 0>());
|
||||||
|
|
||||||
m.def(
|
m.def("free_function", [](Parent *, Child *) {}, py::keep_alive<1, 2>());
|
||||||
"free_function", [](Parent *, Child *) {}, py::keep_alive<1, 2>());
|
m.def("invalid_arg_index", [] {}, py::keep_alive<0, 1>());
|
||||||
m.def(
|
|
||||||
"invalid_arg_index", [] {}, py::keep_alive<0, 1>());
|
|
||||||
|
|
||||||
#if !defined(PYPY_VERSION)
|
#if !defined(PYPY_VERSION)
|
||||||
// test_alive_gc
|
// test_alive_gc
|
||||||
|
@ -461,8 +461,7 @@ TEST_SUBMODULE(class_, m) {
|
|||||||
py::class_<Nested>(base, "Nested")
|
py::class_<Nested>(base, "Nested")
|
||||||
.def(py::init<>())
|
.def(py::init<>())
|
||||||
.def("fn", [](Nested &, int, NestBase &, Nested &) {})
|
.def("fn", [](Nested &, int, NestBase &, Nested &) {})
|
||||||
.def(
|
.def("fa", [](Nested &, int, NestBase &, Nested &) {}, "a"_a, "b"_a, "c"_a);
|
||||||
"fa", [](Nested &, int, NestBase &, Nested &) {}, "a"_a, "b"_a, "c"_a);
|
|
||||||
base.def("g", [](NestBase &, Nested &) {});
|
base.def("g", [](NestBase &, Nested &) {});
|
||||||
base.def("h", []() { return NestBase(); });
|
base.def("h", []() { return NestBase(); });
|
||||||
|
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
cmake_minimum_required(VERSION 3.5)
|
cmake_minimum_required(VERSION 3.5)
|
||||||
|
|
||||||
# The `cmake_minimum_required(VERSION 3.5...3.27)` syntax does not work with
|
# The `cmake_minimum_required(VERSION 3.5...3.29)` syntax does not work with
|
||||||
# some versions of VS that have a patched CMake 3.11. This forces us to emulate
|
# some versions of VS that have a patched CMake 3.11. This forces us to emulate
|
||||||
# the behavior using the following workaround:
|
# the behavior using the following workaround:
|
||||||
if(${CMAKE_VERSION} VERSION_LESS 3.27)
|
if(${CMAKE_VERSION} VERSION_LESS 3.29)
|
||||||
cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
|
cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
|
||||||
else()
|
else()
|
||||||
cmake_policy(VERSION 3.27)
|
cmake_policy(VERSION 3.29)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
project(test_installed_embed CXX)
|
project(test_installed_embed CXX)
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
cmake_minimum_required(VERSION 3.5)
|
cmake_minimum_required(VERSION 3.5)
|
||||||
project(test_installed_module CXX)
|
project(test_installed_module CXX)
|
||||||
|
|
||||||
# The `cmake_minimum_required(VERSION 3.5...3.27)` syntax does not work with
|
# The `cmake_minimum_required(VERSION 3.5...3.29)` syntax does not work with
|
||||||
# some versions of VS that have a patched CMake 3.11. This forces us to emulate
|
# some versions of VS that have a patched CMake 3.11. This forces us to emulate
|
||||||
# the behavior using the following workaround:
|
# the behavior using the following workaround:
|
||||||
if(${CMAKE_VERSION} VERSION_LESS 3.27)
|
if(${CMAKE_VERSION} VERSION_LESS 3.29)
|
||||||
cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
|
cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
|
||||||
else()
|
else()
|
||||||
cmake_policy(VERSION 3.27)
|
cmake_policy(VERSION 3.29)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
project(test_installed_function CXX)
|
project(test_installed_function CXX)
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
cmake_minimum_required(VERSION 3.5)
|
cmake_minimum_required(VERSION 3.5)
|
||||||
|
|
||||||
# The `cmake_minimum_required(VERSION 3.5...3.27)` syntax does not work with
|
# The `cmake_minimum_required(VERSION 3.5...3.29)` syntax does not work with
|
||||||
# some versions of VS that have a patched CMake 3.11. This forces us to emulate
|
# some versions of VS that have a patched CMake 3.11. This forces us to emulate
|
||||||
# the behavior using the following workaround:
|
# the behavior using the following workaround:
|
||||||
if(${CMAKE_VERSION} VERSION_LESS 3.27)
|
if(${CMAKE_VERSION} VERSION_LESS 3.29)
|
||||||
cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
|
cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
|
||||||
else()
|
else()
|
||||||
cmake_policy(VERSION 3.27)
|
cmake_policy(VERSION 3.29)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
project(test_installed_target CXX)
|
project(test_installed_target CXX)
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
cmake_minimum_required(VERSION 3.5)
|
cmake_minimum_required(VERSION 3.5)
|
||||||
|
|
||||||
# The `cmake_minimum_required(VERSION 3.5...3.27)` syntax does not work with
|
# The `cmake_minimum_required(VERSION 3.5...3.29)` syntax does not work with
|
||||||
# some versions of VS that have a patched CMake 3.11. This forces us to emulate
|
# some versions of VS that have a patched CMake 3.11. This forces us to emulate
|
||||||
# the behavior using the following workaround:
|
# the behavior using the following workaround:
|
||||||
if(${CMAKE_VERSION} VERSION_LESS 3.27)
|
if(${CMAKE_VERSION} VERSION_LESS 3.29)
|
||||||
cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
|
cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
|
||||||
else()
|
else()
|
||||||
cmake_policy(VERSION 3.27)
|
cmake_policy(VERSION 3.29)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
project(test_subdirectory_embed CXX)
|
project(test_subdirectory_embed CXX)
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
cmake_minimum_required(VERSION 3.5)
|
cmake_minimum_required(VERSION 3.5)
|
||||||
|
|
||||||
# The `cmake_minimum_required(VERSION 3.5...3.27)` syntax does not work with
|
# The `cmake_minimum_required(VERSION 3.5...3.29)` syntax does not work with
|
||||||
# some versions of VS that have a patched CMake 3.11. This forces us to emulate
|
# some versions of VS that have a patched CMake 3.11. This forces us to emulate
|
||||||
# the behavior using the following workaround:
|
# the behavior using the following workaround:
|
||||||
if(${CMAKE_VERSION} VERSION_LESS 3.27)
|
if(${CMAKE_VERSION} VERSION_LESS 3.29)
|
||||||
cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
|
cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
|
||||||
else()
|
else()
|
||||||
cmake_policy(VERSION 3.27)
|
cmake_policy(VERSION 3.29)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
project(test_subdirectory_function CXX)
|
project(test_subdirectory_function CXX)
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
cmake_minimum_required(VERSION 3.5)
|
cmake_minimum_required(VERSION 3.5)
|
||||||
|
|
||||||
# The `cmake_minimum_required(VERSION 3.5...3.27)` syntax does not work with
|
# The `cmake_minimum_required(VERSION 3.5...3.29)` syntax does not work with
|
||||||
# some versions of VS that have a patched CMake 3.11. This forces us to emulate
|
# some versions of VS that have a patched CMake 3.11. This forces us to emulate
|
||||||
# the behavior using the following workaround:
|
# the behavior using the following workaround:
|
||||||
if(${CMAKE_VERSION} VERSION_LESS 3.27)
|
if(${CMAKE_VERSION} VERSION_LESS 3.29)
|
||||||
cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
|
cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
|
||||||
else()
|
else()
|
||||||
cmake_policy(VERSION 3.27)
|
cmake_policy(VERSION 3.29)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
project(test_subdirectory_target CXX)
|
project(test_subdirectory_target CXX)
|
||||||
|
@ -54,7 +54,11 @@ int f2(int x) noexcept(true) { return x + 2; }
|
|||||||
int f3(int x) noexcept(false) { return x + 3; }
|
int f3(int x) noexcept(false) { return x + 3; }
|
||||||
PYBIND11_WARNING_PUSH
|
PYBIND11_WARNING_PUSH
|
||||||
PYBIND11_WARNING_DISABLE_GCC("-Wdeprecated")
|
PYBIND11_WARNING_DISABLE_GCC("-Wdeprecated")
|
||||||
|
#if defined(__clang_major__) && __clang_major__ >= 5
|
||||||
|
PYBIND11_WARNING_DISABLE_CLANG("-Wdeprecated-dynamic-exception-spec")
|
||||||
|
#else
|
||||||
PYBIND11_WARNING_DISABLE_CLANG("-Wdeprecated")
|
PYBIND11_WARNING_DISABLE_CLANG("-Wdeprecated")
|
||||||
|
#endif
|
||||||
// NOLINTNEXTLINE(modernize-use-noexcept)
|
// NOLINTNEXTLINE(modernize-use-noexcept)
|
||||||
int f4(int x) throw() { return x + 4; } // Deprecated equivalent to noexcept(true)
|
int f4(int x) throw() { return x + 4; } // Deprecated equivalent to noexcept(true)
|
||||||
PYBIND11_WARNING_POP
|
PYBIND11_WARNING_POP
|
||||||
|
@ -289,8 +289,7 @@ TEST_SUBMODULE(copy_move_policies, m) {
|
|||||||
"get_moveissue1",
|
"get_moveissue1",
|
||||||
[](int i) { return std::unique_ptr<MoveIssue1>(new MoveIssue1(i)); },
|
[](int i) { return std::unique_ptr<MoveIssue1>(new MoveIssue1(i)); },
|
||||||
py::return_value_policy::move);
|
py::return_value_policy::move);
|
||||||
m.def(
|
m.def("get_moveissue2", [](int i) { return MoveIssue2(i); }, py::return_value_policy::move);
|
||||||
"get_moveissue2", [](int i) { return MoveIssue2(i); }, py::return_value_policy::move);
|
|
||||||
|
|
||||||
// Make sure that cast from pytype rvalue to other pytype works
|
// Make sure that cast from pytype rvalue to other pytype works
|
||||||
m.def("get_pytype_rvalue_castissue", [](double i) { return py::float_(i).cast<py::int_>(); });
|
m.def("get_pytype_rvalue_castissue", [](double i) { return py::float_(i).cast<py::int_>(); });
|
||||||
|
@ -134,6 +134,16 @@ struct type_caster<other_lib::MyType> : public other_lib::my_caster {};
|
|||||||
} // namespace detail
|
} // namespace detail
|
||||||
} // namespace PYBIND11_NAMESPACE
|
} // namespace PYBIND11_NAMESPACE
|
||||||
|
|
||||||
|
// This simply is required to compile
|
||||||
|
namespace ADL_issue {
|
||||||
|
template <typename OutStringType = std::string, typename... Args>
|
||||||
|
OutStringType concat(Args &&...) {
|
||||||
|
return OutStringType();
|
||||||
|
}
|
||||||
|
|
||||||
|
struct test {};
|
||||||
|
} // namespace ADL_issue
|
||||||
|
|
||||||
TEST_SUBMODULE(custom_type_casters, m) {
|
TEST_SUBMODULE(custom_type_casters, m) {
|
||||||
// test_custom_type_casters
|
// test_custom_type_casters
|
||||||
|
|
||||||
@ -175,14 +185,10 @@ TEST_SUBMODULE(custom_type_casters, m) {
|
|||||||
py::arg_v(nullptr, ArgInspector1()).noconvert(true),
|
py::arg_v(nullptr, ArgInspector1()).noconvert(true),
|
||||||
py::arg() = ArgAlwaysConverts());
|
py::arg() = ArgAlwaysConverts());
|
||||||
|
|
||||||
m.def(
|
m.def("floats_preferred", [](double f) { return 0.5 * f; }, "f"_a);
|
||||||
"floats_preferred", [](double f) { return 0.5 * f; }, "f"_a);
|
m.def("floats_only", [](double f) { return 0.5 * f; }, "f"_a.noconvert());
|
||||||
m.def(
|
m.def("ints_preferred", [](int i) { return i / 2; }, "i"_a);
|
||||||
"floats_only", [](double f) { return 0.5 * f; }, "f"_a.noconvert());
|
m.def("ints_only", [](int i) { return i / 2; }, "i"_a.noconvert());
|
||||||
m.def(
|
|
||||||
"ints_preferred", [](int i) { return i / 2; }, "i"_a);
|
|
||||||
m.def(
|
|
||||||
"ints_only", [](int i) { return i / 2; }, "i"_a.noconvert());
|
|
||||||
|
|
||||||
// test_custom_caster_destruction
|
// test_custom_caster_destruction
|
||||||
// Test that `take_ownership` works on types with a custom type caster when given a pointer
|
// Test that `take_ownership` works on types with a custom type caster when given a pointer
|
||||||
@ -206,4 +212,6 @@ TEST_SUBMODULE(custom_type_casters, m) {
|
|||||||
py::return_value_policy::reference);
|
py::return_value_policy::reference);
|
||||||
|
|
||||||
m.def("other_lib_type", [](other_lib::MyType x) { return x; });
|
m.def("other_lib_type", [](other_lib::MyType x) { return x; });
|
||||||
|
|
||||||
|
m.def("_adl_issue", [](const ADL_issue::test &) {});
|
||||||
}
|
}
|
||||||
|
@ -15,37 +15,26 @@ TEST_SUBMODULE(docstring_options, m) {
|
|||||||
py::options options;
|
py::options options;
|
||||||
options.disable_function_signatures();
|
options.disable_function_signatures();
|
||||||
|
|
||||||
m.def(
|
m.def("test_function1", [](int, int) {}, py::arg("a"), py::arg("b"));
|
||||||
"test_function1", [](int, int) {}, py::arg("a"), py::arg("b"));
|
m.def("test_function2", [](int, int) {}, py::arg("a"), py::arg("b"), "A custom docstring");
|
||||||
m.def(
|
|
||||||
"test_function2", [](int, int) {}, py::arg("a"), py::arg("b"), "A custom docstring");
|
|
||||||
|
|
||||||
m.def(
|
m.def("test_overloaded1", [](int) {}, py::arg("i"), "Overload docstring");
|
||||||
"test_overloaded1", [](int) {}, py::arg("i"), "Overload docstring");
|
m.def("test_overloaded1", [](double) {}, py::arg("d"));
|
||||||
m.def(
|
|
||||||
"test_overloaded1", [](double) {}, py::arg("d"));
|
|
||||||
|
|
||||||
m.def(
|
m.def("test_overloaded2", [](int) {}, py::arg("i"), "overload docstring 1");
|
||||||
"test_overloaded2", [](int) {}, py::arg("i"), "overload docstring 1");
|
m.def("test_overloaded2", [](double) {}, py::arg("d"), "overload docstring 2");
|
||||||
m.def(
|
|
||||||
"test_overloaded2", [](double) {}, py::arg("d"), "overload docstring 2");
|
|
||||||
|
|
||||||
m.def(
|
m.def("test_overloaded3", [](int) {}, py::arg("i"));
|
||||||
"test_overloaded3", [](int) {}, py::arg("i"));
|
m.def("test_overloaded3", [](double) {}, py::arg("d"), "Overload docstr");
|
||||||
m.def(
|
|
||||||
"test_overloaded3", [](double) {}, py::arg("d"), "Overload docstr");
|
|
||||||
|
|
||||||
options.enable_function_signatures();
|
options.enable_function_signatures();
|
||||||
|
|
||||||
m.def(
|
m.def("test_function3", [](int, int) {}, py::arg("a"), py::arg("b"));
|
||||||
"test_function3", [](int, int) {}, py::arg("a"), py::arg("b"));
|
m.def("test_function4", [](int, int) {}, py::arg("a"), py::arg("b"), "A custom docstring");
|
||||||
m.def(
|
|
||||||
"test_function4", [](int, int) {}, py::arg("a"), py::arg("b"), "A custom docstring");
|
|
||||||
|
|
||||||
options.disable_function_signatures().disable_user_defined_docstrings();
|
options.disable_function_signatures().disable_user_defined_docstrings();
|
||||||
|
|
||||||
m.def(
|
m.def("test_function5", [](int, int) {}, py::arg("a"), py::arg("b"), "A custom docstring");
|
||||||
"test_function5", [](int, int) {}, py::arg("a"), py::arg("b"), "A custom docstring");
|
|
||||||
|
|
||||||
{
|
{
|
||||||
py::options nested_options;
|
py::options nested_options;
|
||||||
@ -59,8 +48,7 @@ TEST_SUBMODULE(docstring_options, m) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
m.def(
|
m.def("test_function7", [](int, int) {}, py::arg("a"), py::arg("b"), "A custom docstring");
|
||||||
"test_function7", [](int, int) {}, py::arg("a"), py::arg("b"), "A custom docstring");
|
|
||||||
|
|
||||||
{
|
{
|
||||||
py::options options;
|
py::options options;
|
||||||
|
@ -340,12 +340,10 @@ TEST_SUBMODULE(eigen_matrix, m) {
|
|||||||
if (have_numpy) {
|
if (have_numpy) {
|
||||||
py::module_::import("numpy");
|
py::module_::import("numpy");
|
||||||
Eigen::Matrix<double, 3, 3> defaultMatrix = Eigen::Matrix3d::Identity();
|
Eigen::Matrix<double, 3, 3> defaultMatrix = Eigen::Matrix3d::Identity();
|
||||||
m.def(
|
m.def("defaults_mat", [](const Eigen::Matrix3d &) {}, py::arg("mat") = defaultMatrix);
|
||||||
"defaults_mat", [](const Eigen::Matrix3d &) {}, py::arg("mat") = defaultMatrix);
|
|
||||||
|
|
||||||
Eigen::VectorXd defaultVector = Eigen::VectorXd::Ones(32);
|
Eigen::VectorXd defaultVector = Eigen::VectorXd::Ones(32);
|
||||||
m.def(
|
m.def("defaults_vec", [](const Eigen::VectorXd &) {}, py::arg("vec") = defaultMatrix);
|
||||||
"defaults_vec", [](const Eigen::VectorXd &) {}, py::arg("vec") = defaultMatrix);
|
|
||||||
}
|
}
|
||||||
// test_sparse, test_sparse_signature
|
// test_sparse, test_sparse_signature
|
||||||
m.def("sparse_r", [mat]() -> SparseMatrixR {
|
m.def("sparse_r", [mat]() -> SparseMatrixR {
|
||||||
|
@ -608,7 +608,9 @@ def test_both_ref_mutators():
|
|||||||
def test_nocopy_wrapper():
|
def test_nocopy_wrapper():
|
||||||
# get_elem requires a column-contiguous matrix reference, but should be
|
# get_elem requires a column-contiguous matrix reference, but should be
|
||||||
# callable with other types of matrix (via copying):
|
# callable with other types of matrix (via copying):
|
||||||
int_matrix_colmajor = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]], order="F")
|
int_matrix_colmajor = np.array(
|
||||||
|
[[1, 2, 3], [4, 5, 6], [7, 8, 9]], dtype="l", order="F"
|
||||||
|
)
|
||||||
dbl_matrix_colmajor = np.array(
|
dbl_matrix_colmajor = np.array(
|
||||||
int_matrix_colmajor, dtype="double", order="F", copy=True
|
int_matrix_colmajor, dtype="double", order="F", copy=True
|
||||||
)
|
)
|
||||||
|
@ -121,8 +121,7 @@ void init_tensor_module(pybind11::module &m) {
|
|||||||
[]() { return &get_fixed_tensor<Options>(); },
|
[]() { return &get_fixed_tensor<Options>(); },
|
||||||
py::return_value_policy::copy);
|
py::return_value_policy::copy);
|
||||||
|
|
||||||
m.def(
|
m.def("copy_tensor", []() { return &get_tensor<Options>(); }, py::return_value_policy::copy);
|
||||||
"copy_tensor", []() { return &get_tensor<Options>(); }, py::return_value_policy::copy);
|
|
||||||
|
|
||||||
m.def(
|
m.def(
|
||||||
"copy_const_tensor",
|
"copy_const_tensor",
|
||||||
|
@ -382,4 +382,7 @@ TEST_SUBMODULE(exceptions, m) {
|
|||||||
// function returns None instead of int, should give a useful error message
|
// function returns None instead of int, should give a useful error message
|
||||||
fn().cast<int>();
|
fn().cast<int>();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// m.def("pass_exception_void", [](const py::exception<void>&) {}); // Does not compile.
|
||||||
|
m.def("return_exception_void", []() { return py::exception<void>(); });
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,7 @@ import pytest
|
|||||||
|
|
||||||
import env
|
import env
|
||||||
import pybind11_cross_module_tests as cm
|
import pybind11_cross_module_tests as cm
|
||||||
import pybind11_tests # noqa: F401
|
import pybind11_tests
|
||||||
from pybind11_tests import exceptions as m
|
from pybind11_tests import exceptions as m
|
||||||
|
|
||||||
|
|
||||||
@ -248,6 +248,11 @@ def test_nested_throws(capture):
|
|||||||
assert str(excinfo.value) == "this is a helper-defined translated exception"
|
assert str(excinfo.value) == "this is a helper-defined translated exception"
|
||||||
|
|
||||||
|
|
||||||
|
# TODO: Investigate this crash, see pybind/pybind11#5062 for background
|
||||||
|
@pytest.mark.skipif(
|
||||||
|
sys.platform.startswith("win32") and "Clang" in pybind11_tests.compiler_info,
|
||||||
|
reason="Started segfaulting February 2024",
|
||||||
|
)
|
||||||
def test_throw_nested_exception():
|
def test_throw_nested_exception():
|
||||||
with pytest.raises(RuntimeError) as excinfo:
|
with pytest.raises(RuntimeError) as excinfo:
|
||||||
m.throw_nested_exception()
|
m.throw_nested_exception()
|
||||||
@ -419,3 +424,9 @@ def test_fn_cast_int_exception():
|
|||||||
assert str(excinfo.value).startswith(
|
assert str(excinfo.value).startswith(
|
||||||
"Unable to cast Python instance of type <class 'NoneType'> to C++ type"
|
"Unable to cast Python instance of type <class 'NoneType'> to C++ type"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def test_return_exception_void():
|
||||||
|
with pytest.raises(TypeError) as excinfo:
|
||||||
|
m.return_exception_void()
|
||||||
|
assert "Exception" in str(excinfo.value)
|
||||||
|
@ -34,7 +34,7 @@ def test_captured_large_string(capsys):
|
|||||||
|
|
||||||
|
|
||||||
def test_captured_utf8_2byte_offset0(capsys):
|
def test_captured_utf8_2byte_offset0(capsys):
|
||||||
msg = "\u07FF"
|
msg = "\u07ff"
|
||||||
msg = "" + msg * (1024 // len(msg) + 1)
|
msg = "" + msg * (1024 // len(msg) + 1)
|
||||||
|
|
||||||
m.captured_output_default(msg)
|
m.captured_output_default(msg)
|
||||||
@ -44,7 +44,7 @@ def test_captured_utf8_2byte_offset0(capsys):
|
|||||||
|
|
||||||
|
|
||||||
def test_captured_utf8_2byte_offset1(capsys):
|
def test_captured_utf8_2byte_offset1(capsys):
|
||||||
msg = "\u07FF"
|
msg = "\u07ff"
|
||||||
msg = "1" + msg * (1024 // len(msg) + 1)
|
msg = "1" + msg * (1024 // len(msg) + 1)
|
||||||
|
|
||||||
m.captured_output_default(msg)
|
m.captured_output_default(msg)
|
||||||
@ -54,7 +54,7 @@ def test_captured_utf8_2byte_offset1(capsys):
|
|||||||
|
|
||||||
|
|
||||||
def test_captured_utf8_3byte_offset0(capsys):
|
def test_captured_utf8_3byte_offset0(capsys):
|
||||||
msg = "\uFFFF"
|
msg = "\uffff"
|
||||||
msg = "" + msg * (1024 // len(msg) + 1)
|
msg = "" + msg * (1024 // len(msg) + 1)
|
||||||
|
|
||||||
m.captured_output_default(msg)
|
m.captured_output_default(msg)
|
||||||
@ -64,7 +64,7 @@ def test_captured_utf8_3byte_offset0(capsys):
|
|||||||
|
|
||||||
|
|
||||||
def test_captured_utf8_3byte_offset1(capsys):
|
def test_captured_utf8_3byte_offset1(capsys):
|
||||||
msg = "\uFFFF"
|
msg = "\uffff"
|
||||||
msg = "1" + msg * (1024 // len(msg) + 1)
|
msg = "1" + msg * (1024 // len(msg) + 1)
|
||||||
|
|
||||||
m.captured_output_default(msg)
|
m.captured_output_default(msg)
|
||||||
@ -74,7 +74,7 @@ def test_captured_utf8_3byte_offset1(capsys):
|
|||||||
|
|
||||||
|
|
||||||
def test_captured_utf8_3byte_offset2(capsys):
|
def test_captured_utf8_3byte_offset2(capsys):
|
||||||
msg = "\uFFFF"
|
msg = "\uffff"
|
||||||
msg = "12" + msg * (1024 // len(msg) + 1)
|
msg = "12" + msg * (1024 // len(msg) + 1)
|
||||||
|
|
||||||
m.captured_output_default(msg)
|
m.captured_output_default(msg)
|
||||||
@ -84,7 +84,7 @@ def test_captured_utf8_3byte_offset2(capsys):
|
|||||||
|
|
||||||
|
|
||||||
def test_captured_utf8_4byte_offset0(capsys):
|
def test_captured_utf8_4byte_offset0(capsys):
|
||||||
msg = "\U0010FFFF"
|
msg = "\U0010ffff"
|
||||||
msg = "" + msg * (1024 // len(msg) + 1)
|
msg = "" + msg * (1024 // len(msg) + 1)
|
||||||
|
|
||||||
m.captured_output_default(msg)
|
m.captured_output_default(msg)
|
||||||
@ -94,7 +94,7 @@ def test_captured_utf8_4byte_offset0(capsys):
|
|||||||
|
|
||||||
|
|
||||||
def test_captured_utf8_4byte_offset1(capsys):
|
def test_captured_utf8_4byte_offset1(capsys):
|
||||||
msg = "\U0010FFFF"
|
msg = "\U0010ffff"
|
||||||
msg = "1" + msg * (1024 // len(msg) + 1)
|
msg = "1" + msg * (1024 // len(msg) + 1)
|
||||||
|
|
||||||
m.captured_output_default(msg)
|
m.captured_output_default(msg)
|
||||||
@ -104,7 +104,7 @@ def test_captured_utf8_4byte_offset1(capsys):
|
|||||||
|
|
||||||
|
|
||||||
def test_captured_utf8_4byte_offset2(capsys):
|
def test_captured_utf8_4byte_offset2(capsys):
|
||||||
msg = "\U0010FFFF"
|
msg = "\U0010ffff"
|
||||||
msg = "12" + msg * (1024 // len(msg) + 1)
|
msg = "12" + msg * (1024 // len(msg) + 1)
|
||||||
|
|
||||||
m.captured_output_default(msg)
|
m.captured_output_default(msg)
|
||||||
@ -114,7 +114,7 @@ def test_captured_utf8_4byte_offset2(capsys):
|
|||||||
|
|
||||||
|
|
||||||
def test_captured_utf8_4byte_offset3(capsys):
|
def test_captured_utf8_4byte_offset3(capsys):
|
||||||
msg = "\U0010FFFF"
|
msg = "\U0010ffff"
|
||||||
msg = "123" + msg * (1024 // len(msg) + 1)
|
msg = "123" + msg * (1024 // len(msg) + 1)
|
||||||
|
|
||||||
m.captured_output_default(msg)
|
m.captured_output_default(msg)
|
||||||
|
@ -22,8 +22,7 @@ TEST_SUBMODULE(kwargs_and_defaults, m) {
|
|||||||
m.def("kw_func0", kw_func);
|
m.def("kw_func0", kw_func);
|
||||||
m.def("kw_func1", kw_func, py::arg("x"), py::arg("y"));
|
m.def("kw_func1", kw_func, py::arg("x"), py::arg("y"));
|
||||||
m.def("kw_func2", kw_func, py::arg("x") = 100, py::arg("y") = 200);
|
m.def("kw_func2", kw_func, py::arg("x") = 100, py::arg("y") = 200);
|
||||||
m.def(
|
m.def("kw_func3", [](const char *) {}, py::arg("data") = std::string("Hello world!"));
|
||||||
"kw_func3", [](const char *) {}, py::arg("data") = std::string("Hello world!"));
|
|
||||||
|
|
||||||
/* A fancier default argument */
|
/* A fancier default argument */
|
||||||
std::vector<int> list{{13, 17}};
|
std::vector<int> list{{13, 17}};
|
||||||
@ -79,14 +78,12 @@ TEST_SUBMODULE(kwargs_and_defaults, m) {
|
|||||||
"kw_lb_func5",
|
"kw_lb_func5",
|
||||||
[](const CustomRepr &) {},
|
[](const CustomRepr &) {},
|
||||||
py::arg("custom") = CustomRepr("array([[A, B],\r [C, D]])"));
|
py::arg("custom") = CustomRepr("array([[A, B],\r [C, D]])"));
|
||||||
m.def(
|
m.def("kw_lb_func6", [](const CustomRepr &) {}, py::arg("custom") = CustomRepr(" \v\t "));
|
||||||
"kw_lb_func6", [](const CustomRepr &) {}, py::arg("custom") = CustomRepr(" \v\t "));
|
|
||||||
m.def(
|
m.def(
|
||||||
"kw_lb_func7",
|
"kw_lb_func7",
|
||||||
[](const std::string &) {},
|
[](const std::string &) {},
|
||||||
py::arg("str_arg") = "First line.\n Second line.");
|
py::arg("str_arg") = "First line.\n Second line.");
|
||||||
m.def(
|
m.def("kw_lb_func8", [](const CustomRepr &) {}, py::arg("custom") = CustomRepr(""));
|
||||||
"kw_lb_func8", [](const CustomRepr &) {}, py::arg("custom") = CustomRepr(""));
|
|
||||||
|
|
||||||
// test_args_and_kwargs
|
// test_args_and_kwargs
|
||||||
m.def("args_function", [](py::args args) -> py::tuple {
|
m.def("args_function", [](py::args args) -> py::tuple {
|
||||||
@ -279,11 +276,9 @@ TEST_SUBMODULE(kwargs_and_defaults, m) {
|
|||||||
// These should fail to compile:
|
// These should fail to compile:
|
||||||
#ifdef PYBIND11_NEVER_DEFINED_EVER
|
#ifdef PYBIND11_NEVER_DEFINED_EVER
|
||||||
// argument annotations are required when using kw_only
|
// argument annotations are required when using kw_only
|
||||||
m.def(
|
m.def("bad_kw_only1", [](int) {}, py::kw_only());
|
||||||
"bad_kw_only1", [](int) {}, py::kw_only());
|
|
||||||
// can't specify both `py::kw_only` and a `py::args` argument
|
// can't specify both `py::kw_only` and a `py::args` argument
|
||||||
m.def(
|
m.def("bad_kw_only2", [](int i, py::args) {}, py::kw_only(), "i"_a);
|
||||||
"bad_kw_only2", [](int i, py::args) {}, py::kw_only(), "i"_a);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// test_function_signatures (along with most of the above)
|
// test_function_signatures (along with most of the above)
|
||||||
|
@ -374,8 +374,7 @@ TEST_SUBMODULE(methods_and_attributes, m) {
|
|||||||
m.def("overload_order", [](const std::string &) { return 1; });
|
m.def("overload_order", [](const std::string &) { return 1; });
|
||||||
m.def("overload_order", [](const std::string &) { return 2; });
|
m.def("overload_order", [](const std::string &) { return 2; });
|
||||||
m.def("overload_order", [](int) { return 3; });
|
m.def("overload_order", [](int) { return 3; });
|
||||||
m.def(
|
m.def("overload_order", [](int) { return 4; }, py::prepend{});
|
||||||
"overload_order", [](int) { return 4; }, py::prepend{});
|
|
||||||
|
|
||||||
#if !defined(PYPY_VERSION)
|
#if !defined(PYPY_VERSION)
|
||||||
// test_dynamic_attributes
|
// test_dynamic_attributes
|
||||||
|
@ -287,8 +287,7 @@ TEST_SUBMODULE(numpy_array, sm) {
|
|||||||
// [workaround(intel)] ICC 20/21 breaks with py::arg().stuff, using py::arg{}.stuff works.
|
// [workaround(intel)] ICC 20/21 breaks with py::arg().stuff, using py::arg{}.stuff works.
|
||||||
|
|
||||||
// Only accept the exact types:
|
// Only accept the exact types:
|
||||||
sm.def(
|
sm.def("overloaded3", [](const py::array_t<int> &) { return "int"; }, py::arg{}.noconvert());
|
||||||
"overloaded3", [](const py::array_t<int> &) { return "int"; }, py::arg{}.noconvert());
|
|
||||||
sm.def(
|
sm.def(
|
||||||
"overloaded3",
|
"overloaded3",
|
||||||
[](const py::array_t<double> &) { return "double"; },
|
[](const py::array_t<double> &) { return "double"; },
|
||||||
@ -444,9 +443,8 @@ TEST_SUBMODULE(numpy_array, sm) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// resize to 3D array with each dimension = N
|
// resize to 3D array with each dimension = N
|
||||||
sm.def("array_resize3", [](py::array_t<double> a, size_t N, bool refcheck) {
|
sm.def("array_resize3",
|
||||||
a.resize({N, N, N}, refcheck);
|
[](py::array_t<double> a, size_t N, bool refcheck) { a.resize({N, N, N}, refcheck); });
|
||||||
});
|
|
||||||
|
|
||||||
// test_array_create_and_resize
|
// test_array_create_and_resize
|
||||||
// return 2D array with Nrows = Ncols = N
|
// return 2D array with Nrows = Ncols = N
|
||||||
@ -460,9 +458,8 @@ TEST_SUBMODULE(numpy_array, sm) {
|
|||||||
sm.def("array_view",
|
sm.def("array_view",
|
||||||
[](py::array_t<uint8_t> a, const std::string &dtype) { return a.view(dtype); });
|
[](py::array_t<uint8_t> a, const std::string &dtype) { return a.view(dtype); });
|
||||||
|
|
||||||
sm.def("reshape_initializer_list", [](py::array_t<int> a, size_t N, size_t M, size_t O) {
|
sm.def("reshape_initializer_list",
|
||||||
return a.reshape({N, M, O});
|
[](py::array_t<int> a, size_t N, size_t M, size_t O) { return a.reshape({N, M, O}); });
|
||||||
});
|
|
||||||
sm.def("reshape_tuple", [](py::array_t<int> a, const std::vector<int> &new_shape) {
|
sm.def("reshape_tuple", [](py::array_t<int> a, const std::vector<int> &new_shape) {
|
||||||
return a.reshape(new_shape);
|
return a.reshape(new_shape);
|
||||||
});
|
});
|
||||||
@ -471,8 +468,7 @@ TEST_SUBMODULE(numpy_array, sm) {
|
|||||||
[](const py::array &a) { return a[py::make_tuple(0, py::ellipsis(), 0)]; });
|
[](const py::array &a) { return a[py::make_tuple(0, py::ellipsis(), 0)]; });
|
||||||
|
|
||||||
// test_argument_conversions
|
// test_argument_conversions
|
||||||
sm.def(
|
sm.def("accept_double", [](const py::array_t<double, 0> &) {}, py::arg("a"));
|
||||||
"accept_double", [](const py::array_t<double, 0> &) {}, py::arg("a"));
|
|
||||||
sm.def(
|
sm.def(
|
||||||
"accept_double_forcecast",
|
"accept_double_forcecast",
|
||||||
[](const py::array_t<double, py::array::forcecast> &) {},
|
[](const py::array_t<double, py::array::forcecast> &) {},
|
||||||
@ -493,8 +489,7 @@ TEST_SUBMODULE(numpy_array, sm) {
|
|||||||
"accept_double_f_style_forcecast",
|
"accept_double_f_style_forcecast",
|
||||||
[](const py::array_t<double, py::array::forcecast | py::array::f_style> &) {},
|
[](const py::array_t<double, py::array::forcecast | py::array::f_style> &) {},
|
||||||
py::arg("a"));
|
py::arg("a"));
|
||||||
sm.def(
|
sm.def("accept_double_noconvert", [](const py::array_t<double, 0> &) {}, "a"_a.noconvert());
|
||||||
"accept_double_noconvert", [](const py::array_t<double, 0> &) {}, "a"_a.noconvert());
|
|
||||||
sm.def(
|
sm.def(
|
||||||
"accept_double_forcecast_noconvert",
|
"accept_double_forcecast_noconvert",
|
||||||
[](const py::array_t<double, py::array::forcecast> &) {},
|
[](const py::array_t<double, py::array::forcecast> &) {},
|
||||||
|
@ -536,7 +536,12 @@ def test_format_descriptors_for_floating_point_types(test_func):
|
|||||||
@pytest.mark.parametrize("contiguity", [None, "C", "F"])
|
@pytest.mark.parametrize("contiguity", [None, "C", "F"])
|
||||||
@pytest.mark.parametrize("noconvert", [False, True])
|
@pytest.mark.parametrize("noconvert", [False, True])
|
||||||
@pytest.mark.filterwarnings(
|
@pytest.mark.filterwarnings(
|
||||||
"ignore:Casting complex values to real discards the imaginary part:numpy.ComplexWarning"
|
"ignore:Casting complex values to real discards the imaginary part:"
|
||||||
|
+ (
|
||||||
|
"numpy.exceptions.ComplexWarning"
|
||||||
|
if hasattr(np, "exceptions")
|
||||||
|
else "numpy.ComplexWarning"
|
||||||
|
)
|
||||||
)
|
)
|
||||||
def test_argument_conversions(forcecast, contiguity, noconvert):
|
def test_argument_conversions(forcecast, contiguity, noconvert):
|
||||||
function_name = "accept_double"
|
function_name = "accept_double"
|
||||||
@ -583,7 +588,8 @@ def test_argument_conversions(forcecast, contiguity, noconvert):
|
|||||||
def test_dtype_refcount_leak():
|
def test_dtype_refcount_leak():
|
||||||
from sys import getrefcount
|
from sys import getrefcount
|
||||||
|
|
||||||
dtype = np.dtype(np.float_)
|
# Was np.float_ but that alias for float64 was removed in NumPy 2.
|
||||||
|
dtype = np.dtype(np.float64)
|
||||||
a = np.array([1], dtype=dtype)
|
a = np.array([1], dtype=dtype)
|
||||||
before = getrefcount(dtype)
|
before = getrefcount(dtype)
|
||||||
m.ndim(a)
|
m.ndim(a)
|
||||||
|
@ -405,10 +405,35 @@ TEST_SUBMODULE(numpy_dtypes, m) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// test_dtype
|
// test_dtype
|
||||||
|
// Below we use `L` for unsigned long as unfortunately the only name that
|
||||||
|
// works reliably on Both NumPy 2.x and old NumPy 1.x.
|
||||||
std::vector<const char *> dtype_names{
|
std::vector<const char *> dtype_names{
|
||||||
"byte", "short", "intc", "int_", "longlong", "ubyte", "ushort",
|
"byte",
|
||||||
"uintc", "uint", "ulonglong", "half", "single", "double", "longdouble",
|
"short",
|
||||||
"csingle", "cdouble", "clongdouble", "bool_", "datetime64", "timedelta64", "object_"};
|
"intc",
|
||||||
|
"long",
|
||||||
|
"longlong",
|
||||||
|
"ubyte",
|
||||||
|
"ushort",
|
||||||
|
"uintc",
|
||||||
|
"L",
|
||||||
|
"ulonglong",
|
||||||
|
"half",
|
||||||
|
"single",
|
||||||
|
"double",
|
||||||
|
"longdouble",
|
||||||
|
"csingle",
|
||||||
|
"cdouble",
|
||||||
|
"clongdouble",
|
||||||
|
"bool_",
|
||||||
|
"datetime64",
|
||||||
|
"timedelta64",
|
||||||
|
"object_",
|
||||||
|
// platform dependent aliases (int_ and uint are also NumPy version dependent on windows)
|
||||||
|
"int_",
|
||||||
|
"uint",
|
||||||
|
"intp",
|
||||||
|
"uintp"};
|
||||||
|
|
||||||
m.def("print_dtypes", []() {
|
m.def("print_dtypes", []() {
|
||||||
py::list l;
|
py::list l;
|
||||||
|
@ -3,6 +3,7 @@ import re
|
|||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
import env # noqa: F401
|
import env # noqa: F401
|
||||||
|
from pybind11_tests import PYBIND11_NUMPY_1_ONLY
|
||||||
from pybind11_tests import numpy_dtypes as m
|
from pybind11_tests import numpy_dtypes as m
|
||||||
|
|
||||||
np = pytest.importorskip("numpy")
|
np = pytest.importorskip("numpy")
|
||||||
@ -76,9 +77,7 @@ def partial_nested_fmt():
|
|||||||
partial_size = partial_ld_off + ld.itemsize
|
partial_size = partial_ld_off + ld.itemsize
|
||||||
partial_end_padding = partial_size % np.dtype("uint64").alignment
|
partial_end_padding = partial_size % np.dtype("uint64").alignment
|
||||||
partial_nested_size = partial_nested_off * 2 + partial_size + partial_end_padding
|
partial_nested_size = partial_nested_off * 2 + partial_size + partial_end_padding
|
||||||
return "{{'names':['a'],'formats':[{}],'offsets':[{}],'itemsize':{}}}".format(
|
return f"{{'names':['a'],'formats':[{partial_dtype_fmt()}],'offsets':[{partial_nested_off}],'itemsize':{partial_nested_size}}}"
|
||||||
partial_dtype_fmt(), partial_nested_off, partial_nested_size
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def assert_equal(actual, expected_data, expected_dtype):
|
def assert_equal(actual, expected_data, expected_dtype):
|
||||||
@ -172,13 +171,20 @@ def test_dtype(simple_dtype):
|
|||||||
np.zeros(1, m.trailing_padding_dtype())
|
np.zeros(1, m.trailing_padding_dtype())
|
||||||
)
|
)
|
||||||
|
|
||||||
expected_chars = "bhilqBHILQefdgFDG?MmO"
|
expected_chars = list("bhilqBHILQefdgFDG?MmO")
|
||||||
assert m.test_dtype_kind() == list("iiiiiuuuuuffffcccbMmO")
|
# Note that int_ and uint size and mapping is NumPy version dependent:
|
||||||
|
expected_chars += [np.dtype(_).char for _ in ("int_", "uint", "intp", "uintp")]
|
||||||
|
assert m.test_dtype_kind() == list("iiiiiuuuuuffffcccbMmOiuiu")
|
||||||
assert m.test_dtype_char_() == list(expected_chars)
|
assert m.test_dtype_char_() == list(expected_chars)
|
||||||
assert m.test_dtype_num() == [np.dtype(ch).num for ch in expected_chars]
|
assert m.test_dtype_num() == [np.dtype(ch).num for ch in expected_chars]
|
||||||
assert m.test_dtype_byteorder() == [np.dtype(ch).byteorder for ch in expected_chars]
|
assert m.test_dtype_byteorder() == [np.dtype(ch).byteorder for ch in expected_chars]
|
||||||
assert m.test_dtype_alignment() == [np.dtype(ch).alignment for ch in expected_chars]
|
assert m.test_dtype_alignment() == [np.dtype(ch).alignment for ch in expected_chars]
|
||||||
assert m.test_dtype_flags() == [chr(np.dtype(ch).flags) for ch in expected_chars]
|
if not PYBIND11_NUMPY_1_ONLY:
|
||||||
|
assert m.test_dtype_flags() == [np.dtype(ch).flags for ch in expected_chars]
|
||||||
|
else:
|
||||||
|
assert m.test_dtype_flags() == [
|
||||||
|
chr(np.dtype(ch).flags) for ch in expected_chars
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
def test_recarray(simple_dtype, packed_dtype):
|
def test_recarray(simple_dtype, packed_dtype):
|
||||||
|
@ -41,6 +41,15 @@ class float_ : public py::object {
|
|||||||
};
|
};
|
||||||
} // namespace external
|
} // namespace external
|
||||||
|
|
||||||
|
namespace pybind11 {
|
||||||
|
namespace detail {
|
||||||
|
template <>
|
||||||
|
struct handle_type_name<external::float_> {
|
||||||
|
static constexpr auto name = const_name("float");
|
||||||
|
};
|
||||||
|
} // namespace detail
|
||||||
|
} // namespace pybind11
|
||||||
|
|
||||||
namespace implicit_conversion_from_0_to_handle {
|
namespace implicit_conversion_from_0_to_handle {
|
||||||
// Uncomment to trigger compiler error. Note: Before PR #4008 this used to compile successfully.
|
// Uncomment to trigger compiler error. Note: Before PR #4008 this used to compile successfully.
|
||||||
// void expected_to_trigger_compiler_error() { py::handle(0); }
|
// void expected_to_trigger_compiler_error() { py::handle(0); }
|
||||||
@ -825,6 +834,8 @@ TEST_SUBMODULE(pytypes, m) {
|
|||||||
|
|
||||||
m.def("annotate_tuple_float_str", [](const py::typing::Tuple<py::float_, py::str> &) {});
|
m.def("annotate_tuple_float_str", [](const py::typing::Tuple<py::float_, py::str> &) {});
|
||||||
m.def("annotate_tuple_empty", [](const py::typing::Tuple<> &) {});
|
m.def("annotate_tuple_empty", [](const py::typing::Tuple<> &) {});
|
||||||
|
m.def("annotate_tuple_variable_length",
|
||||||
|
[](const py::typing::Tuple<py::float_, py::ellipsis> &) {});
|
||||||
m.def("annotate_dict_str_int", [](const py::typing::Dict<py::str, int> &) {});
|
m.def("annotate_dict_str_int", [](const py::typing::Dict<py::str, int> &) {});
|
||||||
m.def("annotate_list_int", [](const py::typing::List<int> &) {});
|
m.def("annotate_list_int", [](const py::typing::List<int> &) {});
|
||||||
m.def("annotate_set_str", [](const py::typing::Set<std::string> &) {});
|
m.def("annotate_set_str", [](const py::typing::Set<std::string> &) {});
|
||||||
|
@ -121,7 +121,7 @@ def test_set(capture, doc):
|
|||||||
assert m.anyset_contains({"foo"}, "foo")
|
assert m.anyset_contains({"foo"}, "foo")
|
||||||
|
|
||||||
assert doc(m.get_set) == "get_set() -> set"
|
assert doc(m.get_set) == "get_set() -> set"
|
||||||
assert doc(m.print_anyset) == "print_anyset(arg0: anyset) -> None"
|
assert doc(m.print_anyset) == "print_anyset(arg0: Union[set, frozenset]) -> None"
|
||||||
|
|
||||||
|
|
||||||
def test_frozenset(capture, doc):
|
def test_frozenset(capture, doc):
|
||||||
@ -911,6 +911,13 @@ def test_tuple_empty_annotations(doc):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def test_tuple_variable_length_annotations(doc):
|
||||||
|
assert (
|
||||||
|
doc(m.annotate_tuple_variable_length)
|
||||||
|
== "annotate_tuple_variable_length(arg0: tuple[float, ...]) -> None"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def test_dict_annotations(doc):
|
def test_dict_annotations(doc):
|
||||||
assert (
|
assert (
|
||||||
doc(m.annotate_dict_str_int)
|
doc(m.annotate_dict_str_int)
|
||||||
|
@ -217,9 +217,8 @@ TEST_SUBMODULE(stl, m) {
|
|||||||
// NB: map and set keys are `const`, so while we technically do move them (as `const Type &&`),
|
// NB: map and set keys are `const`, so while we technically do move them (as `const Type &&`),
|
||||||
// casters don't typically do anything with that, which means they fall to the `const Type &`
|
// casters don't typically do anything with that, which means they fall to the `const Type &`
|
||||||
// caster.
|
// caster.
|
||||||
m.def("cast_rv_map", []() {
|
m.def("cast_rv_map",
|
||||||
return std::unordered_map<std::string, RValueCaster>{{"a", RValueCaster{}}};
|
[]() { return std::unordered_map<std::string, RValueCaster>{{"a", RValueCaster{}}}; });
|
||||||
});
|
|
||||||
m.def("cast_rv_nested", []() {
|
m.def("cast_rv_nested", []() {
|
||||||
std::vector<std::array<std::list<std::unordered_map<std::string, RValueCaster>>, 2>> v;
|
std::vector<std::array<std::list<std::unordered_map<std::string, RValueCaster>>, 2>> v;
|
||||||
v.emplace_back(); // add an array
|
v.emplace_back(); // add an array
|
||||||
@ -497,8 +496,7 @@ TEST_SUBMODULE(stl, m) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// test_stl_pass_by_pointer
|
// test_stl_pass_by_pointer
|
||||||
m.def(
|
m.def("stl_pass_by_pointer", [](std::vector<int> *v) { return *v; }, "v"_a = nullptr);
|
||||||
"stl_pass_by_pointer", [](std::vector<int> *v) { return *v; }, "v"_a = nullptr);
|
|
||||||
|
|
||||||
// #1258: pybind11/stl.h converts string to vector<string>
|
// #1258: pybind11/stl.h converts string to vector<string>
|
||||||
m.def("func_with_string_or_vector_string_arg_overload",
|
m.def("func_with_string_or_vector_string_arg_overload",
|
||||||
|
@ -270,7 +270,6 @@ TEST_SUBMODULE(stl_binders, m) {
|
|||||||
PYBIND11_NUMPY_DTYPE(VStruct, w, x, y, z);
|
PYBIND11_NUMPY_DTYPE(VStruct, w, x, y, z);
|
||||||
py::class_<VStruct>(m, "VStruct").def_readwrite("x", &VStruct::x);
|
py::class_<VStruct>(m, "VStruct").def_readwrite("x", &VStruct::x);
|
||||||
py::bind_vector<std::vector<VStruct>>(m, "VectorStruct", py::buffer_protocol());
|
py::bind_vector<std::vector<VStruct>>(m, "VectorStruct", py::buffer_protocol());
|
||||||
m.def("get_vectorstruct", [] {
|
m.def("get_vectorstruct",
|
||||||
return std::vector<VStruct>{{false, 5, 3.0, true}, {true, 30, -1e4, false}};
|
[] { return std::vector<VStruct>{{false, 5, 3.0, true}, {true, 30, -1e4, false}}; });
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
@ -67,9 +67,11 @@ for issue in issues:
|
|||||||
for cat, msgs in cats.items():
|
for cat, msgs in cats.items():
|
||||||
if msgs:
|
if msgs:
|
||||||
desc = cats_descr[cat]
|
desc = cats_descr[cat]
|
||||||
print(f"[bold]{desc}:\n" if desc else "")
|
print(f"[bold]{desc}:" if desc else f".. {cat}")
|
||||||
|
print()
|
||||||
for msg in msgs:
|
for msg in msgs:
|
||||||
print(Syntax(msg, "rst", theme="ansi_light", word_wrap=True))
|
print(Syntax(msg, "rst", theme="ansi_light", word_wrap=True))
|
||||||
|
print()
|
||||||
print()
|
print()
|
||||||
|
|
||||||
if missing:
|
if missing:
|
||||||
|
@ -173,12 +173,16 @@ endif()
|
|||||||
# Check to see which Python mode we are in, new, old, or no python
|
# Check to see which Python mode we are in, new, old, or no python
|
||||||
if(PYBIND11_NOPYTHON)
|
if(PYBIND11_NOPYTHON)
|
||||||
set(_pybind11_nopython ON)
|
set(_pybind11_nopython ON)
|
||||||
|
# We won't use new FindPython if PYBIND11_FINDPYTHON is defined and falselike
|
||||||
|
# Otherwise, we use if FindPythonLibs is missing or if FindPython was already used
|
||||||
elseif(
|
elseif(
|
||||||
_pybind11_missing_old_python STREQUAL "NEW"
|
(NOT DEFINED PYBIND11_FINDPYTHON OR PYBIND11_FINDPYTHON)
|
||||||
OR PYBIND11_FINDPYTHON
|
AND (_pybind11_missing_old_python STREQUAL "NEW"
|
||||||
OR Python_FOUND
|
OR PYBIND11_FINDPYTHON
|
||||||
OR Python2_FOUND
|
OR Python_FOUND
|
||||||
OR Python3_FOUND)
|
OR Python3_FOUND
|
||||||
|
))
|
||||||
|
|
||||||
# New mode
|
# New mode
|
||||||
include("${CMAKE_CURRENT_LIST_DIR}/pybind11NewTools.cmake")
|
include("${CMAKE_CURRENT_LIST_DIR}/pybind11NewTools.cmake")
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user