Files
RustPython/Lib/test
Changjoon 156942e37f Tighten CPython parity for str format spec, %-format, and str() constructor (#7769)
Five related CPython parity gaps in `str` formatting and construction:

1. **`str(bytes, errors=...)` triggers decode mode.** Previously, only
   `encoding=` triggered decode; passing only `errors=` fell back to
   `repr()`. CPython's behavior: presence of `encoding` OR `errors`
   triggers decode mode (default UTF-8 when only `errors` is given).

2. **`'{...}'.format() IndexError wording.** Generic Rust "tuple index
   out of range" replaced with CPython's "Replacement index N out of
   range for positional args tuple".

3. **`{0:3.2s}.format('abc')` → 'ab '.** String format spec applied
   precision after width padding; CPython truncates BEFORE padding.
   Reorder the operations.

4. **`%x` / `%o` / `%X` / `%c` accept `__index__` objects.** Previously
   only `PyInt` downcast was attempted. Mirror CPython's
   PyNumber_Index dispatch via `try_index_opt`.

5. **`%d` / `%u` / `%i` error wording.** "a number is required" →
   "a real number is required" (matches CPython).

Also adds `not <type>` suffix to `%c` error messages so the type is
visible in TypeError text (matches CPython structure even without
fully-qualified names).

Verified byte-identical with CPython 3.14.4 across 25+ probes covering
the format/spec/constructor combinations. Unmasks
`test_str.test_constructor_keyword_args` and
`test_str.test_constructor_defaults`. test_str/test_bytes/test_format/
test_codecs/test_io/test_unicode_identifiers — 1,429 tests pass, 0
regressions. All 188 `extra_tests/snippets/*.py` pass under the CI
feature set.

`test_str.test_format` and `test_str.test_formatting` markers retained:
`test_format` still trips on `'{0:08s}'.format('result')` (numeric
zero-pad treated as fill+left-align by CPython for str type — separate
format-spec parser concern). `test_formatting` still trips on
`%c` error message expecting fully qualified `module.qualname` (RP
returns bare class name — separate broader concern).
2026-05-04 10:28:43 +09:00
..
2026-03-01 11:36:46 +09:00
2025-08-24 10:36:07 +03:00
2026-02-18 03:10:40 +09:00
2025-04-30 14:33:52 +09:00
2026-02-04 09:53:02 +09:00
2023-04-20 15:36:28 +09:00
2023-03-02 15:01:12 +09:00
2026-02-05 00:21:34 +09:00
2022-10-18 03:26:29 +09:00
2026-01-21 20:44:26 +09:00
2023-03-01 18:06:50 +09:00
2026-03-01 11:36:46 +09:00
2026-02-02 02:02:12 +09:00
2026-02-13 22:15:52 +09:00
2026-01-25 15:20:05 +09:00
2025-03-31 18:49:08 +09:00
2026-02-13 13:36:33 +02:00
2026-02-13 13:36:33 +02:00
2026-02-13 14:13:30 +09:00
2026-05-03 00:15:03 +09:00
2025-03-26 02:24:01 -05:00
2024-06-24 19:00:54 +09:00
2026-02-18 00:43:49 +09:00
2026-02-11 16:50:23 +09:00
2026-01-30 16:39:33 +02:00
2026-02-08 20:36:35 +09:00
2026-01-17 19:22:00 +09:00
2025-09-01 11:19:00 +03:00
2026-02-10 00:48:22 +09:00
fix
2026-02-12 01:01:35 +09:00
2026-02-06 00:15:18 +09:00
2026-02-13 13:36:33 +02:00
2026-03-03 15:20:36 +01:00
2026-03-12 13:24:29 +01:00
2026-02-11 18:38:10 +09:00
2026-02-03 22:10:31 +09:00
2026-02-06 00:15:18 +09:00
2026-02-01 19:45:06 -05:00
2023-03-02 05:56:34 +09:00
2026-03-06 06:00:08 +09:00
2026-02-13 13:55:05 +09:00
2026-02-14 18:19:57 +02:00
2026-03-23 13:10:51 +09:00
2026-03-21 22:49:09 +09:00
2026-01-25 00:18:55 +09:00
2026-01-25 00:18:55 +09:00
2026-01-26 10:40:22 +09:00
2026-03-03 20:00:50 +09:00
2026-02-06 00:15:18 +09:00
2025-04-28 12:29:21 +09:00
2026-02-03 22:10:31 +09:00
2026-03-12 18:08:56 +09:00
2025-08-31 11:58:21 +03:00
2026-02-06 01:14:55 +09:00
2026-02-13 13:36:33 +02:00
2026-02-27 09:44:41 +01:00
2026-04-14 13:04:50 +02:00
2026-02-04 18:32:45 +09:00
2026-03-03 19:57:50 +09:00
2026-02-28 22:50:51 +09:00
2026-02-06 00:15:18 +09:00
2026-01-25 00:18:55 +09:00
2026-02-27 10:05:21 +01:00
2025-04-21 21:11:42 -07:00
2026-02-04 09:53:02 +09:00
2026-01-31 20:51:53 -05:00
2025-12-12 10:37:40 +09:00
2026-02-15 09:02:24 +09:00
2026-02-03 22:10:31 +09:00
2026-02-05 23:50:08 +09:00
2026-02-14 21:40:04 +09:00
2026-03-01 11:36:46 +09:00
2026-02-14 09:18:09 +09:00
2025-03-26 23:12:21 -05:00
2026-03-01 10:42:37 +09:00
2026-03-21 22:49:09 +09:00
2026-03-23 11:31:30 +09:00
2026-02-11 16:57:51 +09:00
2026-02-27 22:59:41 +09:00
2026-03-21 22:49:09 +09:00
2025-06-22 22:36:13 +09:00
2026-02-27 16:53:55 +09:00
2026-03-08 18:06:23 +09:00
2026-03-03 21:58:46 +09:00
2026-02-02 01:20:23 +09:00
2025-01-17 18:04:25 -08:00
2026-01-25 00:18:55 +09:00
2026-01-25 00:18:55 +09:00
2026-02-13 13:44:28 +09:00
2026-01-25 00:18:55 +09:00
2026-02-06 00:15:18 +09:00
2025-12-20 12:17:11 +09:00
2026-02-13 13:42:22 +09:00
2026-01-25 00:18:55 +09:00
2026-02-15 23:44:23 +09:00
2026-02-27 09:49:35 +01:00
2026-02-14 18:18:53 +02:00
2026-03-05 17:25:59 +09:00
2023-04-20 15:36:28 +09:00