◐ Shell
clean mode source ↗

gh-99845: Change _PyDict_KeysSize() return type to size_t by vstinner · Pull Request #99848 · python/cpython

@vstinner

  • Change _PyDict_KeysSize() and shared_keys_usable_size() return type from signed (Py_ssize_t) to unsigned (size_t) type.
  • new_values() argument type is now unsigned (size_t).
  • init_inline_values() now uses size_t rather than int for the 'i' iterator variable.
  • type.sizeof() implementation now uses unsigned (size_t) type.
* Change _PyDict_KeysSize() and shared_keys_usable_size() return type
  from signed (Py_ssize_t) to unsigned (size_t) type.
* new_values() argument type is now unsigned (size_t).
* init_inline_values() now uses size_t rather than int for the 'i'
  iterator variable.
* type.__sizeof__() implementation now uses unsigned (size_t) type.

@vstinner

@vstinner

I would prefer to change _PyDict_SizeOf() return type to size_t, but it's not required to fix issue #99845, and it can impact the 3rd party frozendict project which uses it.

@vstinner

I would prefer to change _PyDict_SizeOf() return type to size_t, but it's not required to fix issue #99845, and it can impact the 3rd party frozendict project which uses it.

Another more radical change is to move the private function to internal C API, and frozendict should call dict.__sizeof__() method instead.

methane

Choose a reason for hiding this comment

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

The patch looks good to me.

Is Py_ssize_t recommended for container size and size_t recommended for memory size for now?

@vstinner

I was confused by assert(size > 0); is new_values(). I read it as assert(size >= 0);, to reject negative values. So I replaced it with: assert(size >= 1); which is less confusing for me :-)