GeezerVison is showing github.com — '_PyLong_NumBits': identifier not found in 3.13 · Issue #119336 · python/cpython
'_PyLong_NumBits': identifier not found in 3.13 #119336DescriptionBug report
Bug description:
While fixing pywin32 to let CI builds work in Python 3.13, the build process complained of not being able to find _PyLong_NumBits. All other Python versions in the CI built successfully.
BOOL PyCom_VariantFromPyObject(PyObject *obj, VARIANT *var)
{
// ...
if (PyLong_Check(obj)) {
int sign = _PyLong_Sign(obj);
size_t nbits = _PyLong_NumBits(obj);
if (nbits == (size_t)-1 && PyErr_Occurred())
return FALSE;
// ...
}
The function still exists in main, apparently inaccessible via the public C API since 3.13. What's the recommended replacement?
CPython versions tested on:
3.8, 3.9, 3.10, 3.11, 3.12, 3.13
Operating systems tested on:
Windows
Linked PRs
Activityemmatyping commented on May 22, 2024 In 5846924 Victor restored
_PyLong_Copy()
_PyLong_FromDigits()
_PyLong_New()
_PyLong_Sign()
It seems reasonable to include _PyLong_NumBits as well, since like the others there isn't a great replacement. clin1234 commented on May 22, 2024 ContributorAuthor More actions Will it be restored in the next beta 3.13 release, or will I have to wait until the first 3.14 alpha release? emmatyping commented on May 22, 2024 I cannot make that call, but I made #119418 against 3.14 for now (it can be backported for 3.13 if that's what people decide). Eventually it seems like a good idea to make this public. vstinner commented on May 28, 2024 You can modify pywin32 to call the bit_length() method which returns a Python int object. Then if you need a size_t, you can call PyLong_AsSize_t.
If this function is called by one project, we should consider making it public, rather than restoring the old private function. clin1234 commented on May 28, 2024 ContributorAuthor More actions
You can modify pywin32 to call the bit_length() method which returns a Python int object. Then if you need a size_t, you can call PyLong_AsSize_t.
If this function is called by one project, we should consider making it public, rather than restoring the old private function.
How would I access the built-in bit_length() method within the C API? da-woods commented on May 29, 2024
How would I access the built-in bit_length() method within the C API?
PyObject_CallMethod(obj, "bit_length", NULL)
(Not taking a view on whether that justifies not restoring the function though) vstinner commented on May 29, 2024 A code search in PyPI top 7,500 projects found other projects:
- mariadb (1.1.10)
- pickle5 (0.0.12)
- zodbpickle (3.2)
pickle5 and zodbpickle contain copies of the Python source code, but MariaDB is a good usage example. So maybe it's worth it to add a function.
I created issue gh-119714: [C API] Add PyLong_GetNumBits() function. vstinner commented on May 29, 2024 vstinner commented on Jun 3, 2024 Function restored by commit e50fac9
MetadataMetadataDevelopmentNo branches or pull requestsIssue actions
|