One other note about dictionaries before we move on. Although we can assign to a new key to expand a dictionary, fetching a nonexistent key is still a mistake:
>>> D {'a': 1, 'c': 3, 'b': 2}
>>> D['e'] = 99# Assigning new keys grows dictionaries >>> D {'a': 1, 'c': 3, 'b': 2, 'e': 99}
>>> D['f']# Referencing one is an error ...error text omitted... KeyError: 'f'
This is what we want—it’s usually a programming error to fetch something that isn’t really there. But, in some generic programs, we can’t always know what keys will be present when we write our code. How do we handle such cases and avoid the errors? One trick here is to test ahead of time. The dictionaryhas_keymethod allows us to query the existence of a key and branch on the result with a Pythonifstatement:
>>> D.has_key('f') False
>>> if not D.has_key('f'): print 'missing'
missing
I’ll have much more to say about the if statement and statement syntax in general later in this book, but the form we’re using here is straightforward: it consists of the word if, followed by an expression that is interpreted as a true or false result, followed by a block of code to run if the test is true. In its full form, the if statement can also have an else clause for a default case, and one or more elif(else if) clauses for other tests. It’s the main selection tool in Python, and it’s the way we code logic in our scripts.
There are other ways to create dictionaries and avoid accessing a nonexistent dictionary key (including thegetmethod; theinmembership expression; and thetry statement, a tool we’ll first meet in Chapter 10 that catches and recovers from exceptions altogether), but we’ll save the details on those until a later chapter. Now, let’s move on to tuples.