【问题标题】:Confusing about python byte literal对python字节文字感到困惑
【发布时间】:2019-08-26 08:39:52
【问题描述】:

在python3中,我对字节文字的了解是

  • 只要一个字节可以用可打印的ASCII字符表示,它就会显示为这个字符。例如 b'\x63\xf8' 将是 b'c\xf8'

  • 最近发现有一个奇怪的属性。似乎\ 之后的数字(如果每个数字小于 8 并且所有数字的长度 八进制,例如 b'\123' == b'S',但似乎最大的是 b'\377' == b'\xff'。但是,b'\474' == b'<', b'\574' == b'|'

谁能解释第二个属性上面的奇怪行为? \ 后面的数字形式的字节的一般规则是什么?

【问题讨论】:

  • 0o474 == 316316 % 256 == 60chr(60) == '<'。字节的值只能达到256,因此如果表示的数字大于 256,则仅保留前 8 位。恕我直言,这应该是一个错误(我希望出现无效的转义异常或其他东西)......也许检查值有效性的成本太大而不值得支付,因此这个实现
  • @00 实际上,描述中并没有提到 literals。它正在描述字节对象,并且正如您链接的问题所描述的那样,bytes((0o407,)) 确实会引发ValueError 所描述的问题。文档并没有说文字 \407 将触发 ValueError (事实上,我希望在编译时得到一个 SyntaxError 无效文字......而不是在运行时 ValueError )。
  • @GiacomoAlzetta 谢谢。单字节最高值不是 255 吗?
  • @Spaceship222 在这里(对于 Python),是的。参见例如docs.python.org/3/library/functions.html#func-bytes 。可以说,有有符号和无符号字节,但 Python 使用无符号字节。
  • @GiacomoAlzetta 谢谢,这对我来说很糟糕。该句子以“While byte literals [...]”开头,但在逗号之后继续以“, bytes objects 实际上 [...]”。我会在我的回答中注明。

标签: python python-3.x


【解决方案1】:

这是 CPython 实现中的一个错误。

documentation about bytes 声明如下:

虽然 bytes 文字和表示基于 ASCII 文本,但 bytes 对象实际上表现得像不可变的整数序列,序列中的每个值都受到限制,使得 0 ValueError )。

从技术上讲,这提到了字节对象,而不是字节文字,因此外推可能被视为无效,也就是说,b'\407' 的行为不必与bytes((0o407,)) 相同(实际上,它目前没有) .

这种行为是 filed as a bug 最近才出现的(2019 年 6 月)。即将发布一个修复程序,但似乎仅针对 Python 3.9 进行了计划,并将为 b'\407' 引发 ValueError

我不清楚现有版本(包括 3.8,它处于测试阶段)是否会有错误修复版本;可能不会,因为这可能会改变依赖此行为的软件的结果。

(更好奇的:这是当前提交的补丁:https://github.com/python/cpython/pull/14654。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 2023-03-17
    • 2015-03-13
    • 1970-01-01
    相关资源
    最近更新 更多