python 3 不支持 `b'%s' % obj` 这类直接字节串格式化,因其严格区分文本(

在 Python 2 中,b'%s' % obj 可直接对 None、整数、列表等内置类型进行字节串插值,这源于其模糊的字符串/字节边界。而 Python 3 明确将 bytes 视为二进制数据,不提供内置类型的隐式字节表示——即不存在所谓“安装 bytestring formatters”的机制。所有对象必须先转为 Unicode 字符串(str),再按需编码为 bytes。
# 正确:先格式化为 str,再 encode
>>> ('%s' % None).encode('utf-8')
b'None'
>>> ('%s' % 15).encode('utf-8')
b'15'
>>> ('%s' % [1, 'hello']).encode('utf-8')
b"[1, 'hello']"ASCII 编码:适用于纯 ASCII 内容,但遇到非 ASCII 字符(如 'café')会抛出 UnicodeEncodeError:
>>> ('%s' % ['café']).encode('ascii') # ❌ 失败
UnicodeEncodeError: 'ascii' codec can't encode character '\xe9'...UTF-8 编码:推荐用于通用场景,能无损表示所有 Unicode 字符:
>>> ('%s' % ['café', '∀', '?']).encode('utf-8')
b"['caf\\xc3\\xa9', '\\xe2\\x88\\x80', '\\xf0\\x9f\\x91\\x8d']"%a + ASCII 编码:当目标协议要求纯 ASCII 字节且需保留可读性时,使用 repr() 等效的 %a 格式符,自动转义非 ASCII 字符:
>>> ('%a' % ['café', '∀']).encode('ascii')
b"['caf\\xe9', '\\u2200']"此方式等价于 repr(obj).encode('ascii'),适合调试、日志或受限协议传输。
这一模式不仅解决端口问题,更强化了 Python 3 对文本/数据边界的清晰管控,是现代 Python 协议开发的健壮基础。