# Fluent Python
## Data Structures
### The Python Data Model
- Using special methods
- Users don't have to memorize arbitrary method names.
- Benefit from rich python std lib and avoid reinventing the wheel.
- ==Special methods are meant to be called by the Python interpreter, not by
you.==
- Dunder method = double-underscored method
- Pythonic
- `# doctest: +ELLIPSIS` directive to elide the output
- `__repr__`
- Called by interactive console and debugger
- Similar to `%r` place holder and `!r` conversion field (for standard
representation, without quote)
- This method should be capable of recreating the object
- `__str__`
- Is meant for end users.
- This falls back to `__repr__`
- If only one is implemented, implement `__repr__`
- `__bool__`
- `bool` invokes `__bool__` and uses the result
- If not implemented, invoke `__len__`, if `0`, return `False`
- Otherwise truthy.
- ABC
- `Sequence`, `Mapping`, and `Set`
- Collection should implement: `Iterable`, `Sized`, and `Container`
- Since Python 3.7, `dict` is officially "ordered", i.e. key insertion order
is preserved
- Reversed operator = when the special method on the first operand can't be used
- `len()` is not a method
- When `x` is a built-in type, `len(x)` simply read from a field in the
CPython C struct.
- "Practicality is better than purity"
- `len` may be considered as an unary operator
- _The Art of the Metaobject Protocol (AMOP)_
- _metaobject_ = the objects that are the building blocks of the language
itself
- an API for core language constructs
- A rich metaobject protocol enables extending a language to support new
programming paradigms