Refining import
We saw in playing_cards.py
that we had to refer to label
by its full name playing_cards.label
. This is not what we originally wanted. The original desire was to be able to write,
# blackjack.py
...
print('You are holding,')
for card in hand:
print('The', label(card))
...
Python allows us to do this using variations in import
syntax. If we only want to import
the function label
from the module playing_cards.py
and to refer to it by its 'first name' alone, i.e. as label
, we can write
from playing_cards import label
...
print('You are holding,')
for card in hand:
print('The', label(card).)
...
If you want to import
all the functions in playing_cards
and refer to them just by their “first names” you can use,
from playing_cards import *
...
print('You are holding,')
for card in hand:
print('The', label(card))
...
You can even rename a function as you import
it. If you want to import label
but refer to it as card_name
you can use,
from playing_cards import label as card_name
...
print('You are holding,')
for card in hand:
print('The', card_name(card))
...
A warning!
There is a danger of making a habit of importing functions and referring
to them by first name as in the first two examples above. If multiple
modules have functions by the same name, e.g. you import two modules
both of which have a function named label
, the second import
of label
will redefine the function and you will only have access to
that version. Like all conveniences there is a cost!