Skip to content

GH-50398 [Python] Use more CPython Limited APIs in python/pyarrow - #50409

Open
mroeschke wants to merge 18 commits into
apache:mainfrom
mroeschke:limited-api-direct-replacements
Open

GH-50398 [Python] Use more CPython Limited APIs in python/pyarrow#50409
mroeschke wants to merge 18 commits into
apache:mainfrom
mroeschke:limited-api-direct-replacements

Conversation

@mroeschke

@mroeschke mroeschke commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

Rationale for this change

What changes are included in this PR?

This is an agent generated PR that swaps implementations to use CPython Limited APIs and required less reworks.

  • Replaced direct Py_TYPE(obj)->tp_name struct-field reads with a new limited-API helper (PyObject_StdStringTypeName, built on PyType_GetName)
  • Replaced direct tp_as_number->nb_int slot access with PyType_GetSlot(..., Py_nb_int)
  • Replaced the PyType_HasFeature macro with PyType_GetFlags(...) bit tests
  • Replaced several macros with their equivalent function forms
  • Replaced the static PyTypeObject + PyStructSequence_InitType2 pattern with a cached PyStructSequence_NewType

Are these changes tested?

Yes

Are there any user-facing changes?

No

@mroeschke
mroeschke requested review from AlenkaF and pitrou as code owners July 7, 2026 18:39
Copilot AI review requested due to automatic review settings July 7, 2026 18:39
@mroeschke
mroeschke requested review from raulcd and rok as code owners July 7, 2026 18:39
@github-actions github-actions Bot added the awaiting review Awaiting review label Jul 7, 2026
@github-actions

github-actions Bot commented Jul 7, 2026

Copy link
Copy Markdown

Thanks for opening a pull request!

If this is not a minor PR. Could you open an issue for this pull request on GitHub? https://github.com/apache/arrow/issues/new/choose

Opening GitHub issues ahead of time contributes to the Openness of the Apache Arrow project.

Then could you also rename the pull request title in the following format?

GH-${GITHUB_ISSUE_ID}: [${COMPONENT}] ${SUMMARY}

or

MINOR: [${COMPONENT}] ${SUMMARY}

See also:

@mroeschke mroeschke changed the title Use more CPython Limited APIs in python/pyarrow GH-50398 [Python] Use more CPython Limited APIs in python/pyarrow Jul 7, 2026
@github-actions

github-actions Bot commented Jul 7, 2026

Copy link
Copy Markdown

⚠️ GitHub issue #50398 has been automatically assigned in GitHub to PR creator.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR refactors PyArrow’s C/Cython extension code to reduce reliance on CPython internal struct-field access and macro APIs, moving toward wider use of CPython Limited API-compatible functions (as part of the long-term goal of supporting abi3 wheels).

Changes:

  • Introduces internal::PyObject_StdStringTypeName() (based on PyType_GetName) and switches multiple error paths to use it instead of reading Py_TYPE(obj)->tp_name.
  • Replaces several CPython macros / struct accesses with function-based APIs (e.g., PyFloat_AsDouble, PyTuple_GetItem, PyList_SetItem, PyBytes_Size/AsString, PyType_GetSlot, PyType_GetFlags).
  • Switches the MonthDayNano struct-sequence type initialization to a cached PyStructSequence_NewType() pattern.

Reviewed changes

Copilot reviewed 15 out of 15 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
python/pyarrow/src/arrow/python/udf.cc Use limited-API helper for Python type names in error messages.
python/pyarrow/src/arrow/python/python_to_arrow.cc Replace macros with function forms for float/tuple/list APIs.
python/pyarrow/src/arrow/python/pyarrow.cc Use limited-API helper for type names in unwrap error messages.
python/pyarrow/src/arrow/python/numpy_to_arrow.cc Replace bytes/tuple macros with function APIs.
python/pyarrow/src/arrow/python/io.cc Use limited-API helper for type names in IO error messages.
python/pyarrow/src/arrow/python/inference.cc Use limited-API helper for dict-key type name error messages.
python/pyarrow/src/arrow/python/helpers.h Declare the new PyObject_StdStringTypeName() helper.
python/pyarrow/src/arrow/python/helpers.cc Implement type-name helper; switch to PyType_GetSlot / PyType_GetFlags.
python/pyarrow/src/arrow/python/extension_type.cc Use limited-API helper for extension instance type name in ToString().
python/pyarrow/src/arrow/python/decimal.cc Use limited-API helper for type names in decimal conversion errors.
python/pyarrow/src/arrow/python/datetime.cc Switch MonthDayNano struct-sequence init to cached PyStructSequence_NewType.
python/pyarrow/src/arrow/python/common.h Include helpers and replace bytes macro access; improve type-name errors.
python/pyarrow/src/arrow/python/benchmark.cc Replace list access macro with function form.
python/pyarrow/src/arrow/python/arrow_to_pandas.cc Replace list-set macro with PyList_SetItem.
python/pyarrow/io.pxi Replace PyBytes_AS_STRING usage with PyBytes_AsString in Cython.

Comment thread python/pyarrow/src/arrow/python/python_to_arrow.cc
Comment thread python/pyarrow/src/arrow/python/python_to_arrow.cc
Comment thread python/pyarrow/src/arrow/python/datetime.cc
Comment thread python/pyarrow/src/arrow/python/helpers.cc
@pitrou

pitrou commented Jul 8, 2026

Copy link
Copy Markdown
Member

There are CI failures due to an unexpected deprecation warning, see python/cpython#124182 (comment) for a potential solution.

}

std::string PyObject_StdStringTypeName(PyObject* obj) {
// Once Python 3.10 is dropped, this can use PyType_GetName(Py_TYPE(obj)) (added in 3.11).

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To be fair we are just about to release 25.0.0, Release Candidate already created and being voted, which is the last release which will support Python 3.10. We could just drop 3.10 from main any time now.

@github-actions github-actions Bot added awaiting changes Awaiting changes and removed awaiting review Awaiting review labels Jul 8, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should probably remove this file instead. Nobody ever runs.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good. Removed.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's not yet removed from the PR apparently :)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oops sorry, removed in ba93f58

Also just FYI since this was the only benchmark in python/pyarrow/benchmark.py this lead to additional cleanups 2fee899

Comment on lines 406 to 407

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not replace these as well? Or are they part of the Limited API?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, yeah these are not part of the Limited API. Changed in f308f1c

Comment on lines +402 to +403
bytes = PyBytes_AsString(obj);
size = PyBytes_Size(obj);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Need to check for errors here, at least as a debug assertion (since those functions shouldn't fail on a bytes object).

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For all these error checking, an agent picked up on using RETURN_IF_PYERROR in f308f1c. Let me know if I should use something else

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Well, there's no reason for errors here so we can just have:

    if (PyBytes_Check(obj)) {
      bytes = PyBytes_AsString(obj);
      size = PyBytes_Size(obj);
      DCHECK(!PyErr_Occurred());

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah gotcha. Followed this pattern in bfa0d50

}

const int32_t length = static_cast<int32_t>(PyBytes_GET_SIZE(utf8_obj.obj()));
const int32_t length = static_cast<int32_t>(PyBytes_Size(utf8_obj.obj()));

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Need to check for errors.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As an alternative, we can add PyBytes_AsStdStringView that would return a std::string_view of a PyBytes object, and use it here.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure in b1b1e72 I defined PyBytes_AsStdStringView in helpers.cc and used it here

}
PyArray_Descr* sub_dtype =
reinterpret_cast<PyArray_Descr*>(PyTuple_GET_ITEM(tup, 0));
reinterpret_cast<PyArray_Descr*>(PyTuple_GetItem(tup, 0));

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Need to check for errors.

PyList_SET_ITEM(bytes_field_names_.obj(), i, bytes);
PyList_SET_ITEM(unicode_field_names_.obj(), i, unicode);
PyList_SetItem(bytes_field_names_.obj(), i, bytes);
PyList_SetItem(unicode_field_names_.obj(), i, unicode);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Need to assert for errors.

Copilot AI review requested due to automatic review settings July 8, 2026 21:45
@github-actions github-actions Bot added awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Jul 8, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 15 out of 15 changed files in this pull request and generated 5 comments.

Comment on lines 598 to 602
PyObject* MonthDayNanoIntervalToNamedTuple(
const MonthDayNanoIntervalType::MonthDayNanos& interval) {
OwnedRef tuple(PyStructSequence_New(&MonthDayNanoTupleType));
OwnedRef tuple(PyStructSequence_New(MonthDayNanoTupleType));
if (ARROW_PREDICT_FALSE(tuple.obj() == nullptr)) {
return nullptr;
Comment thread python/pyarrow/src/arrow/python/python_to_arrow.cc
Comment thread python/pyarrow/src/arrow/python/python_to_arrow.cc
Comment thread python/pyarrow/src/arrow/python/arrow_to_pandas.cc
Comment thread python/pyarrow/src/arrow/python/helpers.cc
Copilot AI review requested due to automatic review settings July 8, 2026 22:03

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 16 out of 16 changed files in this pull request and generated 3 comments.

Comment on lines 603 to 606
PyObject* MonthDayNanoIntervalToNamedTuple(
const MonthDayNanoIntervalType::MonthDayNanos& interval) {
OwnedRef tuple(PyStructSequence_New(&MonthDayNanoTupleType));
OwnedRef tuple(PyStructSequence_New(MonthDayNanoTupleType));
if (ARROW_PREDICT_FALSE(tuple.obj() == nullptr)) {
Comment thread python/pyarrow/src/arrow/python/python_to_arrow.cc
Comment thread python/pyarrow/src/arrow/python/python_to_arrow.cc

@pitrou pitrou left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here are some additional comments, but I notice some of the existing comments haven't been addressed.

std::string PyBytes_AsStdString(PyObject* obj) {
ARROW_DCHECK(PyBytes_Check(obj));
return std::string(PyBytes_AS_STRING(obj), PyBytes_GET_SIZE(obj));
return std::string(PyBytes_AsString(obj), PyBytes_Size(obj));

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can use PyBytes_AsStringAndSize as below.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

return "?";
}
Py_ssize_t size;
const char* data = PyUnicode_AsUTF8AndSize(name_ref.obj(), &size);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not use PyUnicode_AsStdString?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's not yet removed from the PR apparently :)

}

const int32_t length = static_cast<int32_t>(PyBytes_GET_SIZE(utf8_obj.obj()));
const int32_t length = static_cast<int32_t>(PyBytes_Size(utf8_obj.obj()));

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As an alternative, we can add PyBytes_AsStdStringView that would return a std::string_view of a PyBytes object, and use it here.

Copilot AI review requested due to automatic review settings July 23, 2026 21:57
@mroeschke mroeschke changed the title GH-50398 [Python] Use more CPython Limited APIs in python/pyarrow GH-50398 [Python] Use more CPython Limited APIs in python/pyarrow, remove pyarrow.benchmark Jul 23, 2026
@mroeschke mroeschke changed the title GH-50398 [Python] Use more CPython Limited APIs in python/pyarrow, remove pyarrow.benchmark GH-50398 [Python] Use more CPython Limited APIs in python/pyarrow Jul 23, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Not ready to approve

There are confirmed error-handling issues (unchecked PyList_SetItem / PyBytes_AsStringAndSize) and a likely nullptr crash risk in MonthDayNanoIntervalToNamedTuple, plus user-visible changes not reflected in the PR description.

Review details

Comments suppressed due to low confidence (4)

python/pyarrow/src/arrow/python/python_to_arrow.cc:1053

  • PyList_SetItem() can fail (and sets an exception); the return value is currently ignored, so failures won’t be propagated and the loop continues with a pending Python error. Please check the return value and use RETURN_IF_PYERROR() to surface the failure as a Status.
          PyUnicode_FromStringAndSize(field_name.c_str(), field_name.size());
      RETURN_IF_PYERROR();
      PyList_SetItem(bytes_field_names_.obj(), i, bytes);
      PyList_SetItem(unicode_field_names_.obj(), i, unicode);

python/pyarrow/src/arrow/python/python_to_arrow.cc:1270

  • PyList_SetItem() return value is ignored while building the list from an iterator. If SetItem fails, a Python exception will be set but this function will continue and return Status::OK(), leaving a pending error.
        break;
      }
      PyList_SetItem(lst, i, item);
    }

python/pyarrow/src/arrow/python/helpers.cc:112

  • PyBytes_AsStringAndSize() return value is ignored. If it fails, this returns a std::string_view over a null buffer (undefined behavior on later use).
  ARROW_DCHECK(PyBytes_Check(obj));
  char* buffer = nullptr;
  Py_ssize_t length = 0;
  PyBytes_AsStringAndSize(obj, &buffer, &length);
  return std::string_view(buffer, length);

python/pyarrow/src/arrow/python/datetime.cc:606

  • MonthDayNanoIntervalToNamedTuple() calls PyStructSequence_New(MonthDayNanoTupleType) without ensuring MonthDayNanoTupleType has been initialized; after this change it is a nullptr by default, so this can crash if NewMonthDayNanoTupleType() hasn’t been called yet in the process.
PyObject* MonthDayNanoIntervalToNamedTuple(
    const MonthDayNanoIntervalType::MonthDayNanos& interval) {
  OwnedRef tuple(PyStructSequence_New(MonthDayNanoTupleType));
  if (ARROW_PREDICT_FALSE(tuple.obj() == nullptr)) {
  • Files reviewed: 23/23 changed files
  • Comments generated: 3
  • Review effort level: Low

Note

Your feedback helps us improve the quality of this feature.
Please use 👍 or 👎 to tell us whether this assessment is correct.

Comment thread python/pyarrow/src/arrow/python/helpers.cc
Comment thread python/pyarrow/src/arrow/python/datetime.cc
Comment thread python/pyarrow/lib.pyx
Comment on lines 239 to 243
# IPC / Messaging
include "ipc.pxi"

# Micro-benchmark routines
include "benchmark.pxi"

# Public API
include "public-api.pxi"
Copilot AI review requested due to automatic review settings July 23, 2026 22:17
@mroeschke
mroeschke requested a review from pitrou July 23, 2026 22:22

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Not ready to approve

MonthDayNano interval conversion can now segfault due to using an uninitialized cached PyTypeObject* in MonthDayNanoIntervalToNamedTuple().

Review details

Comments suppressed due to low confidence (2)

python/pyarrow/src/arrow/python/datetime.cc:606

  • MonthDayNanoIntervalToNamedTuple() now calls PyStructSequence_New(MonthDayNanoTupleType) without ensuring MonthDayNanoTupleType has been initialized. Since MonthDayNanoTupleType starts as nullptr, calling this before NewMonthDayNanoTupleType() will segfault (e.g., MonthDayNanoIntervalScalar.as_py() can be used without ever running type inference).
PyObject* MonthDayNanoIntervalToNamedTuple(
    const MonthDayNanoIntervalType::MonthDayNanos& interval) {
  OwnedRef tuple(PyStructSequence_New(MonthDayNanoTupleType));
  if (ARROW_PREDICT_FALSE(tuple.obj() == nullptr)) {

python/pyarrow/lib.pyx:243

  • The PR removes the pyarrow micro-benchmark surface (benchmark.pxi include, plus related sources/modules elsewhere). That is a user-visible API change (imports like pyarrow.benchmark) and also affects ASV benchmark coverage, but the PR description says there are no user-facing changes and doesn't mention the removal. If this is intentional, it should be called out (and ideally deprecated first); otherwise, keep the benchmark module and update it to use limited-API-safe calls instead of deleting it.
# IPC / Messaging
include "ipc.pxi"

# Public API
include "public-api.pxi"
  • Files reviewed: 23/23 changed files
  • Comments generated: 0 new
  • Review effort level: Low

Note

Your feedback helps us improve the quality of this feature.
Please use 👍 or 👎 to tell us whether this assessment is correct.

Comment on lines +435 to +438
bytes = PyBytes_AsString(ref.obj());
RETURN_IF_PYERROR();
size = PyBytes_Size(ref.obj());
RETURN_IF_PYERROR();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Similarly as above, this can be reduced to a single ARROW_DCHECK as these calls shouldn't normally fail after PyBytes_Check returned true.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, done in c9c3910

Copilot AI review requested due to automatic review settings July 28, 2026 18:34

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Not ready to approve

A conversion path now calls PyFloat_AsDouble() without checking for Python exceptions, and the PR also removes packaged benchmark entry points despite stating there are no user-facing changes.

Once you've addressed the issues Copilot identified, you can request another Copilot review.

Review details

Comments suppressed due to low confidence (3)

python/pyarrow/src/arrow/python/python_to_arrow.cc:1053

  • PyList_SetItem() returns -1 and sets an exception on failure; unlike the macro form, it isn't infallible. These calls ignore the return value, so a failure would leave a Python exception pending and potentially corrupt later error handling. Consider checking the return value (pattern used elsewhere, e.g. python/pyarrow/src/arrow/python/numpy_convert.cc:400-402).
      PyList_SetItem(bytes_field_names_.obj(), i, bytes);
      PyList_SetItem(unicode_field_names_.obj(), i, unicode);

python/pyarrow/lib.pyx:243

  • This removes the packaged pyarrow.benchmark/benchmark_PandasObjectIsNull entry points (and the corresponding C++ sources). That is a user-visible API change and also potentially impacts ASV/perf tracking; the PR description currently states “No user-facing changes”. If the intent is to keep benchmarks, they likely need to be updated to use the limited API rather than removed; if the intent is to drop them, please explicitly call that out (and consider a deprecation path or release-note entry).
# IPC / Messaging
include "ipc.pxi"

# Public API
include "public-api.pxi"

python/pyarrow/src/arrow/python/python_to_arrow.cc:259

  • PyFloat_AsDouble() can set a Python exception (e.g., for float subclasses) and returns -1.0 on error. This branch doesn't check PyErr_Occurred(), so conversion could silently succeed with an invalid value while an exception is pending.
    if (PyFloat_Check(obj)) {
      value = PyFloat_AsDouble(obj);
    } else if (internal::PyFloatScalar_Check(obj)) {
  • Files reviewed: 23/23 changed files
  • Comments generated: 0 new
  • Review effort level: Low

We're testing this review assessment. Please use 👍 or 👎 to tell us if it's correct.

Copilot AI review requested due to automatic review settings July 31, 2026 17:01

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Not ready to approve

It introduces a crash risk in MonthDayNanoIntervalToNamedTuple due to uninitialized cached type usage, and it removes pyarrow.benchmark despite the PR stating no user-facing changes.

Once you've addressed the issues Copilot identified, you can request another Copilot review.

This review doesn't count toward merge requirements. Sign up for the private preview to control whether Copilot approvals count.

Review details

Suppressed comments (3)

python/pyarrow/lib.pyx:243

  • This PR removes the pyarrow.benchmark bindings (benchmark.pxi / benchmark.py, the exported C++ symbol, and the ASV microbenchmark). That is a user-visible API / repository tooling change, but the PR description says there are no user-facing changes. Either keep the module (possibly behind a deprecation path) or update the PR description / release notes to reflect the removal.
# File IO
include "io.pxi"

# IPC / Messaging
include "ipc.pxi"

# Public API
include "public-api.pxi"

python/pyarrow/src/arrow/python/datetime.cc:606

  • MonthDayNanoTupleType is now a lazily-initialized pointer, but MonthDayNanoIntervalToNamedTuple() calls PyStructSequence_New(MonthDayNanoTupleType) without ensuring the type has been created. If NewMonthDayNanoTupleType() was never called (e.g., code paths not going through ImportPresentIntervalTypes), this will dereference nullptr and crash.
PyObject* MonthDayNanoIntervalToNamedTuple(
    const MonthDayNanoIntervalType::MonthDayNanos& interval) {
  OwnedRef tuple(PyStructSequence_New(MonthDayNanoTupleType));
  if (ARROW_PREDICT_FALSE(tuple.obj() == nullptr)) {

python/pyarrow/src/arrow/python/common.h:31

  • common.h now includes arrow/python/helpers.h, which pulls in arrow/python/numpy_interop.h (and NumPy headers). common.h is included broadly across the Arrow Python C++ sources, so this can unintentionally make non-NumPy-dependent translation units require NumPy headers and increases compile-time coupling. Prefer forward-declaring PyObject_StdStringTypeName() here instead of including helpers.h.
#include "arrow/buffer.h"
#include "arrow/python/helpers.h"
#include "arrow/python/pyarrow.h"
#include "arrow/python/visibility.h"
#include "arrow/result.h"
#include "arrow/util/logging.h"
#include "arrow/util/macros.h"
  • Files reviewed: 23/23 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

We're testing this review assessment. Please use 👍 or 👎 to tell us if it's correct.

@mroeschke
mroeschke requested a review from pitrou July 31, 2026 18:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants