Python ascii 函数
上次修改时间:2025 年 4 月 11 日
这份全面的指南探讨了 Python 的 ascii 函数,该函数返回一个包含对象可打印表示形式的字符串。我们将介绍字符串转换、非 ASCII 处理以及 ASCII 转义序列的实际示例。
基本定义
ascii 函数返回一个包含对象可打印表示形式的字符串,其中非 ASCII 字符会被转义。它的工作方式与 repr 类似,但会转义非 ASCII 字符。
主要特征:将任何对象转换为其 ASCII 表示形式,使用 \x、\u 或 \U 转义符转义非 ASCII 字符,并且始终返回一个字符串。它对于调试和序列化非常有用。
基本字符串转换
这是一个简单的用法,展示了 ascii 如何以不同于 repr 和 str 的方式处理 ASCII 和非 ASCII 字符串。
# ASCII string
print(ascii("hello")) # 'hello'
# Non-ASCII string
print(ascii("héllö")) # 'h\xe9ll\xf6'
# Comparison with repr
print(repr("héllö")) # 'héllö'
print(str("héllö")) # héllö
此示例显示 ascii 将字符串转换为仅 ASCII 表示形式。非 ASCII 字符使用 \x 序列转义。
与 repr 的区别很明显 - repr 保留原始字符,而 ascii 转义它们。
非 ASCII 字符处理
此示例演示了 ascii 如何处理来自不同 Unicode 范围的各种非 ASCII 字符。
# Latin-1 Supplement (é)
print(ascii("café")) # 'caf\xe9'
# Greek (π)
print(ascii("πr²")) # '\u03c0r\xb2'
# Emoji (😊)
print(ascii("Hello 😊")) # 'Hello \U0001f60a'
# Chinese (你好)
print(ascii("你好")) # '\u4f60\u597d'
该函数根据字符的 Unicode 代码点以不同的方式转义字符。Latin-1 使用 \x,BMP 使用 \u,更高的平面使用 \U。
此行为确保输出字符串仅包含 ASCII 字符,同时通过转义序列保留所有信息。
带有 __repr__ 的自定义对象
ascii 通过调用其 __repr__ 方法然后转义结果来处理自定义对象。此示例显示了该行为。
class Person:
def __init__(self, name):
self.name = name
def __repr__(self):
return f"Person({self.name})"
p1 = Person("Alice")
p2 = Person("Álice")
print(ascii(p1)) # 'Person(Alice)'
print(ascii(p2)) # 'Person(\xc1lice)'
Person 类实现了 __repr__。当我们调用实例上的 ascii 时,它首先获取表示字符串,然后转义非 ASCII。
这显示了如何在维护仅 ASCII 输出的同时将 ascii 与自定义对象一起使用。
容器类型
当与列表或字典等容器一起使用时,ascii 会转义所有包含元素中的非 ASCII 字符。
data = [
"café",
{"key": "välue"},
(1, "π"),
{"α", "β"}
]
print(ascii(data))
# ['caf\xe9', {'key': 'v\xe4lue'}, (1, '\u03c0'), {'\u03b1', '\u03b2'}]
该示例显示 ascii 递归处理容器元素。如果每个字符串元素包含非 ASCII 字符,则会被转义。
当您需要序列化数据同时确保 ASCII 输出时(例如,对于某些网络协议),此行为很有用。
错误处理
ascii 函数不会因任何输入类型而引发错误,因为它依赖于对象的 __repr__ 方法。
class BadRepr:
def __repr__(self):
return "Bad: café"
print(ascii(BadRepr())) # 'Bad: caf\xe9'
print(ascii(123)) # '123'
print(ascii([1, 2, 3])) # '[1, 2, 3]'
print(ascii(None)) # 'None'
这些示例演示了 ascii 在不同类型上的行为。它首先获取字符串表示形式,然后转义非 ASCII 字符。
即使使用返回非 ASCII 的自定义 __repr__,ascii 也会在最终输出中转义这些字符。
最佳实践
- 用于调试: 当您需要非 ASCII 数据的仅 ASCII 输出时
- 首选 repr: 当您想保留原始字符时
- 实现 __repr__: 用于控制 ASCII 输出的自定义对象
- 考虑 encode: 当您需要字节而不是转义字符串时
- 记录使用情况: 明确指出何时需要 ASCII 输出
资料来源
作者
列出所有 Python 教程。