[Tutor] Baccarat code check.
Peter Otten
__peter__ at web.de
Sat Dec 17 10:49:54 CET 2011
col speed wrote:
> If anyone has the time, please have a look at the attached text file
> and let me know any comments on how to improve it.
At first glance the code looks good. I think you can move to the next level
now ;)
Are you using a version control system? If not, have a look at mercurial.
Here's an introduction: http://hginit.com/
Once you've checked in the code you can start writing tests that verify the
correctness of parts of it, see http://docs.python.org/library/unittest.html
Don't be afraid to change your code to make it easier to test. That's called
"refactoring" and usually improves the code quality. If something goes wrong
you always have the previous version in the version control.
How do you know you're done writing tests? There's a great tool that helps
you measure what portion of your code is exercised by your tests:
http://pypi.python.org/pypi/coverage
Do you know the style guide for Python code
(http://www.python.org/dev/peps/pep-0008/)? You should at least consider to
follow it.
Now to your actual code: I don't know Baccarat and haven't looked closely at
your script. I think you should base your Card class on data rather than
calculations. That will simplify it significantly:
_cards = [
("1", 1),
("2", 2),
("3", 3),
("4", 4),
("5", 5),
("6", 6),
("7", 7),
("8", 8),
("9", 9),
("10", 0),
("J", 0),
("Q", 0),
("K", 0),
("A", 1),
]
class Card(object):
def __init__(self, name, value):
self.name = name
self.value = value
cards = [Card(n, v) for n, v in _cards]
class Shoe(list):
"""A collection of 8 decks of cards"""
def __init__(self):
self[:] = cards*(4*8)
random.shuffle(self)
#...
Once you have unittests in place you can try and replace your Card
implementation with mine and see if your script continues to work correctly.
Last and least:
- I ran your script and got an UnboundLocalError (I'm sorry I didn't keep
the traceback); there must be a code path in main() where last_card is
undefined. Try to separate the program logic from the user interface. This
makes it easier to identify and reproduce problems in the program logic and
to write tests to prevent them in the future.
- random.choice() takes a list argument
More information about the Tutor
mailing list