I agree that some more docs on the specialness of None (and, to a lessor extent, True and False). A few comments:
None is a keyword ==============
None = 0 SyntaxError: can't assign to keyword
One of the implications of this is that “None” will always be the Singleton None object — so you can (and should) use: Something is None To test for None.
The Command Line Interpreter hides None =================================
None
That’s a good one to highlight!
None is false in a boolean context ==========================
bool(None) False
Maybe this belongs more in a discussion of “Falseyness”
Procedures return None ==================
a = [3,1,2] b = a.sort() a, b ([1, 2, 3], None)
This is less about None than about the convention that mutating methods return None. Maybe that discussion belongs elsewhere.
Dictionary get returns None if not found ==============================
{}.get('dne') is None True
Belongs with dict docs really, and not really true — dict.get() returns the default value, which is None be default.
None is default return value =====================
def fn(): pass ... fn() # No response! print(fn()) # Here's why. None
Yup.
None is used as a sentinel default value ============================== Particularly useful when default value must be determined in body of function. --- def insort_right(a, x, lo=0, hi=None): # ... if hi is None: hi = len(a) ---
This is also a convention — and primarily applies to mutable defaults, which you hardly ever want to assign directly. So a good example of None being used as a sentinel, but nog really anything special about None. -CHB
/