Pewarta Proxy

📋 Server Request & Proxy Logs

Loading active proxy settings...
Developed by Khairul Adha (adhexa.id)
Mengambil log server...

⚙️ Pengaturan Proxy Target

Skip to content

bytes.fromhex() should parse a bytes #129349

Closed

Description

@lordmauve

Feature or enhancement

Proposal:

bytes.fromhex() should accept a bytes:

>>> bytes.fromhex(b'8a3218def90a84cb4373beed87d9ba1ccc7d90d1')
b'\x8a2\x18\xde\xf9\n\x84\xcbCs\xbe\xed\x87\xd9\xba\x1c\xcc}\x90\xd1'

Background:

bytes.fromhex() accepts a str:

>>> bytes.fromhex('8a3218def90a84cb4373beed87d9ba1ccc7d90d1')
b'\x8a2\x18\xde\xf9\n\x84\xcbCs\xbe\xed\x87\xd9\xba\x1c\xcc}\x90\xd1'

However, it refuses to parse a byte string:

>>> bytes.fromhex(b'8a3218def90a84cb4373beed87d9ba1ccc7d90d1')
Traceback (most recent call last):
  File "<python-input-0>", line 1, in <module>
    bytes.fromhex(b'8a3218def90a84cb4373beed87d9ba1ccc7d90d1')
    ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: fromhex() argument must be str, not bytes

This requires an extra .decode(), which is rather wasteful given that the str is not of any real use.

This came up for me in parsing the output of git cat-file --batch, which must be a binary stream because it contains bytes, but includes header lines like

8a3218def90a84cb4373beed87d9ba1ccc7d90d1 100644 1394

The integers are parseable directly from bytes:

>>> int(b'100644', 8)
33188

so it seems like an omission that the SHAs are not.

Has this already been discussed elsewhere?

This is a minor feature, which does not need previous discussion elsewhere

Links to previous discussion of this feature:

No response

Linked PRs

Activity

  1. added a commit that references this issue on Feb 8, 2025
    c0968d9
  2. serhiy-storchaka commented on Feb 20, 2025

    @serhiy-storchaka
    Member

    You have to look at the discussion that preceded introduction of bytes.fromhex() or ask the authors of the feature why it only supports str.

    BTW, float.fromhex() also only supports str.

  3. serhiy-storchaka commented on Feb 27, 2025

    @serhiy-storchaka
    Member

    For reference, bytes.fromhex() was added by @birkenfeld in 0b9b9e0. bytes at that time was a mutable type, later it was renamed to bytearray, and str became new bytes. Initially, fromhex() accepted 8-bit and Unicode strings. It stopped support of 8-bit strings only after making new bytes and new str not interoperable in Python 3.0. So I do not see reasons against supporting bytes here.

  4. added 3 commits that reference this issue on Mar 7, 2025
    6e76faf
    9b12a64
    81d7ea2
  5. added a commit that references this issue on Mar 12, 2025
  6. vstinner commented on Mar 12, 2025

    @vstinner
    Member

    Implemented in e0637ce.

  7. serhiy-storchaka commented on Mar 13, 2025

    @serhiy-storchaka
    Member

    I had doubts about supporting the general buffer protocol (see #779 and #71759). The buffer protocol is for binary data, and here we have text data. But it is difficult to decide in which cases to support only bytes, in which bytes and bytearray, and in which any "bytes-like" object.

    Note also that the complex constructor only supports str, not bytes (there may be open or closed issue for this).

  8. vstinner commented on Mar 13, 2025

    @vstinner
    Member

    IMO it's convenient to accept bytes when the "text" is ASCII only.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    interpreter-core(Objects, Python, Grammar, and Parser dirs)type-featureA feature request or enhancement

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions