Python ascii Function
Last modified April 11, 2025
This comprehensive guide explores Python's ascii function, which
returns a string containing a printable representation of an object. We'll cover
string conversion, non-ASCII handling, and practical examples of ASCII escape
sequences.
Basic Definitions
The ascii function returns a string containing a printable
representation of an object, with non-ASCII characters escaped. It works
similarly to repr but escapes non-ASCII characters.
Key characteristics: converts any object to its ASCII representation, escapes non-ASCII characters using \x, \u or \U escapes, and always returns a string. It's useful for debugging and serialization.
Basic String Conversion
Here's simple usage showing how ascii handles ASCII and non-ASCII
strings differently from repr and str.
# 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ö
This example shows ascii converting strings to ASCII-only
representation. Non-ASCII characters are escaped using \x sequences.
The difference from repr is clear - repr preserves
the original characters while ascii escapes them.
Non-ASCII Characters Handling
This example demonstrates how ascii handles various non-ASCII
characters from different Unicode ranges.
# 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'
The function escapes characters differently based on their Unicode code point. Latin-1 uses \x, BMP uses \u, and higher planes use \U.
This behavior ensures the output string contains only ASCII characters while preserving all information through escape sequences.
Custom Objects with __repr__
ascii works with custom objects by calling their __repr__
method and then escaping the result. This example shows the behavior.
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)'
The Person class implements __repr__. When we call ascii
on instances, it first gets the representation string then escapes non-ASCII.
This shows how ascii can be used with custom objects while
maintaining ASCII-only output.
Container Types
When used with containers like lists or dictionaries, ascii
escapes non-ASCII characters in all contained elements.
data = [
"café",
{"key": "välue"},
(1, "π"),
{"α", "β"}
]
print(ascii(data))
# ['caf\xe9', {'key': 'v\xe4lue'}, (1, '\u03c0'), {'\u03b1', '\u03b2'}]
The example shows ascii recursively processing container elements.
Each string element gets escaped if it contains non-ASCII characters.
This behavior is useful when you need to serialize data while ensuring ASCII output, such as for certain network protocols.
Error Handling
The ascii function doesn't raise errors for any input type as it
relies on the object's __repr__ method.
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'
These examples demonstrate ascii's behavior with different types.
It first gets the string representation then escapes non-ASCII characters.
Even with a custom __repr__ that returns non-ASCII, ascii
will escape those characters in the final output.
Best Practices
- Use for debugging: When you need ASCII-only output for non-ASCII data
- Prefer repr: When you want to preserve original characters
- Implement __repr__: For custom objects to control ASCII output
- Consider encode: When you need bytes instead of escaped strings
- Document usage: Clearly indicate when ASCII output is required
Source References
Author
List all Python tutorials.