Re: [Tutor] designing POOP

2008-02-07 Thread Alan Gauld
Kent Johnson [EMAIL PROTECTED] wrote

 Let me say that I don't mean any disrespect for Alan or his 
 approach, I
 just have a different point of view.

Heh, heh! I was waiting for someone to post a message like this.
I'll respond by saying the noun/verb thing is not actually the
method I would normally use (although when all else fails I
do drop back to it as a starter technique). However I have found
it to be a techhnique that woerks well for beginners who don't
know how to get started. Partly because it is fairly mechanistic.

But noun/verb does have some problems and often produces
designs that have too many classes and that do not make
best use of OOP idioms like polymorphism or abstraction.
But for beginners and in small problems it is a good starter.

 Also I will say that converting a procedural program to OO 'just
 because' is not necessarily a good idea. Not every program is 
 improved
 by OOP. In your case, it probably will be though.

This is absolutely true. Too many people approach OOP as
if it were some kind of holy grail that is inherently better
than other styles - it isn't, its just another tool in the toolkit.

 I tend to work from small pieces to larger ones and let the design 
 grow
 from the needs of the code, rather than from considerations of nouns 
 and
 verbs in the spec.

I agree at the micro level and in fact my discussion of
explorers and monsters merging into a figher superclass
hopefully illustrates how that micro level design/code cycle
can generate new features of a design including new
classes/objects. Many OO Design gurus have commented
on the way that OO design tends to cycle between top down
design - identifying core classes - and bottom up design - writing
the lowest building blocks and using that to discover more
about the higher level needs.

OO design is a very organic process compared to procedural
design which tends to bemuch more top down and heirarchical
in nature. In my experience at least.

 accommodate it. Design a little, code a little, repeat...
 http://personalpages.tds.net/~kent37/stories/3.html

Exactly so.

 The writings of Robert C Martin have taught me a lot about good 
 design
 and agile development. They don't all apply to Python

Martin is very good on Agile, I'm less impressed with his OO writing,
largely because he does tend to see the world through the eyes
of C++ and Java, both of which have a very singular view of OO
which does not always work in other more dynamic OOP
languages (Lisp, Smalltalk, Python, JavaScript etc)

 I don't use the command-line interpreter much, I do a lot more work 
 in
 unit tests. In test-driven development (TDD), if you decide you want 
 a
 Room class, the first thing you do is create a unit test for the 
 class.

For production programming I wholly endorse that approach,
for exploring and inventing code structures (which is mainly
what I use Python for, the results get converted to Java
where we use TDD) I find the interpreter is very useful.

To use TDD effectively you first need to know what you are
trying to do. An example of bad use of TDD can be found in
one of Robert Martins books where he tries to give an example
of pair programming of a bowling game scorer. Unfortunately
because of the haphazard design approach they wind up
with code that is both bloated (it repeats an algorithm twice)
and faulty (one of the algorithm implementations is broken).
Unfortunately they don't detect the fault because the test data
they used missed out all of the cases where the defect is
exhibited... Note it wasn't the test that was broken it was
the limited data set used. And that is one of the big limitations
of TDD, it is only as effective as the test data.

It is important to realize that there is no single way to design
OOP programs. The noun/verb thing is a good way to get
started and often effective when nothing else seems to
be working. But there are plenty of other approaches out
there and books by authors like Booch, Rumbaugh, Jacobsen,
Schaer/Mellor, Coad/Yourdon, Wirfs-Brock and yes, Robert Martin
are all worh reading to see the different approaches available.
The Coad/Nicola OOP book is especially interesting because
it contrasts the same problems in C++ and Smalltalk (which
is conceptually close to python) and shows how the choice
of language can have a big impact on detailed OOP design
decisions.

Once you get experienced in OPP you will not
use the noun/verb te4chnique very often because your brain
will start to think in terms of objects without need of intermediate
tools. In fact when I went back to COBOL for the Y2K bug I
found it hard initially to think procedurally because I'd been
using OOP for so long by then. Nowadays I don;t write so
much code I find I switch between both modes of design
without really thinking too much about it. On small scale
stuff I tend to go procedural but on big problems I tend to
go OOP.

Alan G. 


___
Tutor maillist  -  

Re: [Tutor] designing POOP

2008-02-07 Thread bhaaluu
On Feb 6, 2008 8:15 PM, Kent Johnson [EMAIL PROTECTED] wrote:
 
 Design a little, code a little, repeat...
 http://personalpages.tds.net/~kent37/stories/3.html

 
 You can discover many useful design techniques by applying DRY. More here:
 http://personalpages.tds.net/~kent37/stories/00012.html

 
 It has a chapter that explains the code smells and points out
 ways to fix them. An abbreviated version is available here:
 http://wiki.java.net/bin/view/People/SmellsToRefactorings

 The writings of Robert C Martin have taught me a lot about good design
 and agile development.  A lot of his work is available on-line:
 http://objectmentor.com/resources/publishedArticles.html

 http://objectmentor.com/resources/articles/Principles_and_Patterns.pdf
 might be a good starting point.
 http://objectmentor.com/resources/articles/xpepisode.htm attempts to
 give the flavor of agile, test-driven development.

 I don't use the command-line interpreter much, I do a lot more work in
 unit tests.  I have written a little more about this here:
 http://personalpages.tds.net/~kent37/stories/7.html

 HTH,
 Kent

Thank you Kent! I am open to all suggestions as to where to get started
learning how to  design with the Python Object-Oriented Paradigm.
I'm doing a lot of reading, some coding (in my 'testing' directory),
and a lot of thinking about what I'm trying to do. This is a learning situation.
Since I'm a Hobbyist programmer, I don't have a 'class' deadline to meet
(and believe me, I'm happy about that!). I do feel that learning how to do this
will enhance the enjoyment of my Hobby for years to come. I do know that
it will open a lot of doors for me that are currently closed, especially when
it comes to creating games with Python/PyGame, and so forth. Plus, it is
quite possible that this discussion will benefit others who are also just
beginning.

Happy Happy Joy Joy.
-- 
b h a a l u u at g m a i l dot c o m
You assist an evil system most effectively by obeying its
orders and decrees. An evil system never deserves such
allegiance.  Allegiance to it means partaking of the evil.
A good person will resist an evil system with his or her
whole soul. [Mahatma Gandhi]
___
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor


[Tutor] A bit about python culture

2008-02-07 Thread Michael Bernhard Arp Sørensen
Greetings Masters.

I was wondering if there's a well know word for python programmers, that is
usable as a domain name. Unfortunately, pug.dk, as in python user group,
Denmark, is unavailable here in Denmark.

I hope to acquire a national domain name and let future local user groups
choose their own third level domain name.

Any ideas are welcome.

-- 
Kind regards

Michael B. Arp Sørensen
Programmer / BOFH

I am /root and if you see me laughing you better have a backup.
___
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor


[Tutor] A bit about python culture

2008-02-07 Thread Michael Bernhard Arp Sørensen
Greetings Masters.

I was wondering if there's a well know word for python programmers, that is
usable as a domain name. Unfortunately, pug.dk, as in python user group,
Denmark, is unavailable here in Denmark.

I hope to acquire a national domain name and let future local user groups
choose their own third level domain name.

Any ideas are welcome.

-- 
Kind regards

Michael B. Arp Sørensen
Programmer / BOFH

I am /root and if you see me laughing you better have a backup.
___
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] A bit about python culture

2008-02-07 Thread Kent Johnson
Michael Bernhard Arp Sørensen wrote:
 Greetings Masters.
 
 I was wondering if there's a well know word for python programmers, that 
 is usable as a domain name.

Pythonista is one. pythonista.dk seems to be available.

Kent
___
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] designing POOP

2008-02-07 Thread Kent Johnson
Alan Gauld wrote:
 Kent Johnson [EMAIL PROTECTED] wrote
 The writings of Robert C Martin have taught me a lot about good 
 design
 and agile development. They don't all apply to Python
 
 Martin is very good on Agile, I'm less impressed with his OO writing,
 largely because he does tend to see the world through the eyes
 of C++ and Java, both of which have a very singular view of OO
 which does not always work in other more dynamic OOP
 languages (Lisp, Smalltalk, Python, JavaScript etc)

I found his writing on principles of OO design very helpful when I was a 
C++ programmer. I admit I have not revisited them from the point-of-view 
of a Python programmer. I'm sure some of the techniques are not needed - 
the pervasive use of interfaces, in particular - but the underlying 
principles should still apply.

Taking a closer look, I think these still have something to offer:
The Liskov Substitution Principle
http://objectmentor.com/resources/articles/lsp.pdf

Inheritance vs. Delegation (Template Method and Strategy patterns)
http://objectmentor.com/resources/articles/inheritanceVsDelegation.pdf

The Craftsman series might be of interest.

One thing to keep in mind is that when C++ and Java use interfaces, 
Python uses duck typing. C++ and Java use classes to encapsulate 
functions (e.g. in Strategy) but Python can use functions directly.

Kent

___
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] A bit about python culture

2008-02-07 Thread Thomas B.Døderlein
Michael Bernhard Arp Sørensen wrote:
 Greetings Masters.
 
 I was wondering if there's a well know word for python programmers, that 
 is usable as a domain name.

Pythonista is one. pythonista.dk seems to be available.

Kent

Other available  .dk domains

pyproject.dk

pyprojects.dk

python-project.dk

pythonprogram.dk


These might be used for project subdomains, then the programmers might add 
their name in E-mail adresses. Doing this you will also marked Python projects 
+ making people aware of Python as a programming language. Just a thought :)



BR
Thomas




___
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor

___
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor


[Tutor] Anyone fancy giving me some tips and an expert opinion??

2008-02-07 Thread Damian Archer
I have written what i see as a pretty decent script to resolve this
question:

Write an improved version of the Chaos program from Chapter 1 that allows a
user to input two initial
values and the number of iterations and then prints a nicely formatted table
showing how the values
change over time. For example, if the starting values were .25 and .26 with
10 iterations, the table
might look like this:
index 0.25 0.26

1 0.731250 0.750360
2 0.766441 0.730547
3 0.698135 0.767707
4 0.821896 0.695499
5 0.570894 0.825942
6 0.955399 0.560671
7 0.166187 0.960644
8 0.540418 0.147447
9 0.968629 0.490255
10 0.118509 0.974630

Although it works I am sure I could have gone about this a better way, it
probably doesn't fit all the rules of best practice either. Was wondering if
anyone would mind having a look and offering a few tips??

# chaos.py
# A program to mimic the chaos theory

def main():

print Example of Chaos

# User inputs numbers to compare, z is for the index counter
x = input(Enter a number between 1 and 0: )
y = input(Enter a second number between 1 and 0: )
z = 0

# Prints the table borders and titles
print '%10s %20s %20s' % (Index, x, y)
print --
tempx = x
tempy = y

# Loops calculates 'chaotic behaviour for input numbers
for i in range(10):
tempx = 3.9 * tempx * (1 - tempx)
tempy = 3.9 * tempy * (1 - tempy)
z = z + 1
# Print chaotice results into table
print '%10s %20s %20s' % (z, tempx, tempy)

raw_input(Press any key to exit)

main()

Thanks!!! And thanks for all the help you've all supplied me with so far,
you guys certainly are an extremely valuable resource!!
___
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] A bit about python culture

2008-02-07 Thread Dotan Cohen
On 07/02/2008, Michael Bernhard Arp Sørensen [EMAIL PROTECTED] wrote:
 Greetings Masters.

 I was wondering if there's a well know word for python programmers, that is
 usable as a domain name. Unfortunately, pug.dk, as in python user group,
 Denmark, is unavailable here in Denmark.

 I hope to acquire a national domain name and let future local user groups
 choose their own third level domain name.

 Any ideas are welcome.


[EMAIL PROTECTED]:~$ whois python.dk
# Any use of this material to target advertising or similar activities
# are explicitly forbidden and will be prosecuted. DK Hostmaster A/S
# requests to be notified of any such activities or suspicions thereof.

Domain:   python.dk
DNS:  python.dk
Registered:   1999-09-14
Expires:  2008-09-30
Registration period:  1 year
VID:  no
Status:   Active

Nameservers
Hostname: ns1.rackserverz.biz
Hostname: ns2.rackserverz.biz

[EMAIL PROTECTED]:~$ whois pyden.dk
# Any use of this material to target advertising or similar activities
# are explicitly forbidden and will be prosecuted. DK Hostmaster A/S
# requests to be notified of any such activities or suspicions thereof.

No entries found for the selected source.
[EMAIL PROTECTED]:~$


pyden.dk doesn't sound too bad.

Dotan Cohen

http://what-is-what.com
http://gibberish.co.il
א-ב-ג-ד-ה-ו-ז-ח-ט-י-ך-כ-ל-ם-מ-ן-נ-ס-ע-ף-פ-ץ-צ-ק-ר-ש-ת

A: Because it messes up the order in which people normally read text.
Q: Why is top-posting such a bad thing?
___
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] Thought of some other things.

2008-02-07 Thread Timothy Sikes

 Date: Thu, 7 Feb 2008 00:05:54 -0500 From: [EMAIL PROTECTED] To: [EMAIL 
 PROTECTED]; Tutor@python.org Subject: Re: [Tutor] Thought of some other 
 things.  On Feb 6, 2008 11:38 PM, Timothy Sikes [EMAIL PROTECTED] wrote: 
   First off, I was running my script from my flash drive-That could have 
 caused something. Next, I have possible found something IN the location 
 where I ran the script, I found a pic_db.bat with stuff in it... It still 
 doesn't explain why the program crashed, but it does explain why I didn't 
 think it was doing anything.  Your question is unclear, Timothy. Running 
 from the flash drive is not going to cause your program to crash. The 
 interpreter is in the PATH of your computer and you can run your program 
 from flash drive, cd or from the floppy drive.  pic_db.bat could be 
 anything. Google for it and verify if it is not a virus.  Paste the error 
 message you received for more specific response.  Thanks,  Well, the 
 problem was I wasn't getting an error message.  My computer would just stop 
 and log me off.  Sorry I didn't specify before, but the pic_db.bat is the 
 result of the 'make_db' command.  So it basically started to work, then 
 crashed my computer.  I meant to ask whether or not anyone could see anything 
 that would cause my system to restart, but it's not necissary now.  For some 
 reason, when I ran this script the second time, only this time saving the 
 list of files to a list, and then using the 'make_db' command on each and 
 every file in the list seemed to work.  If anyone can tell me why my computer 
 restarted off the top of thier head, great, but otherwise Im not going to 
 worry about it now Thanks though!
  --  --  O.R.Senthil Kumaran http://phoe6.livejournal.com 
  ___ Tutor maillist - 
  Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
_
Climb to the top of the charts! Play the word scramble challenge with star 
power.
http://club.live.com/star_shuffle.aspx?icid=starshuffle_wlmailtextlink_jan___
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] designing POOP

2008-02-07 Thread Marc Tompkins
 Sorry, my bad - this was my me, but I forgot to hit Reply All.
My me?  I think I meant to type my message.
-- 
www.fsrtechnologies.com
___
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] designing POOP

2008-02-07 Thread Kent Johnson
bhaaluu wrote:
 Best practice?

Use class attributes when you actually want a shared attribute, for 
example for constants with class scope, or as defaults when instance 
attributes may not be assigned. Class attributes can be redefined by 
subclasses which makes them useful as a way to configure a class.

Don't use them strictly as documentation. Write a docstring instead.

My $.02
Kent
___
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor


[Tutor] Fwd: designing POOP

2008-02-07 Thread Marc Tompkins
Sorry, my bad - this was my me, but I forgot to hit Reply All.

Here's a situation I often encounter, and I was wondering what the
best practice is.  I've generally initialized my classes' attributes
this same way:
 class TestClass1(object):
  please give me a better name
 def __init__(self):
 please document me
 self.name = 
 self.answer = 
 self.strength = 20
 self.wealth = 45
 self.light = 0
 self.tally = 0
but it could also be done like so:
 class TestClass1(object):
  please give me a better name
 name = 
 answer = 
 strength = 20
 wealth = 45
 light = 0
 tally = 0
 def __init__(self,name=Zed):
 please document me
 self.name = name
 ...etc.

I realize that the two are NOT equivalent if you're using the class as
a static class, rather than instantiating it (e.g. using a static
class called Global while weaning oneself from global variables...)
However, I'm asking about this present case: the class under
discussion will always be instantiated.  It seems to me that declaring
the attributes in the class body makes the class more amenable to
introspection, but are there downsides I'm not seeing?  What's the
best practice?

Standing by to get flamed...
-- 
www.fsrtechnologies.com
___
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] designing POOP

2008-02-07 Thread bob gailer
Also beware the difference between reassigning and extending:

class F:
  a = 3
  b = []
  def __init__(self, a, b):
self.a = a
self.b.append(b)
  def show(self):
print self.a, self.b

f1=F(1,2)
f2=F(3,4)
f1.show() # 1 [2, 4]
f2.show() # 3 [2, 4]

-- 
Bob Gailer
919-636-4239 Chapel Hill, NC

___
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] designing POOP

2008-02-07 Thread bhaaluu
I was asked:

quote

Here's a situation I often encounter, and I was wondering what the
best practice is.  I've generally initialized my classes' attributes
this same way:

 class TestClass1(object):
  please give me a better name
 def __init__(self):
 please document me
 self.name = 
 self.answer = 
 self.strength = 20
 self.wealth = 45
 self.light = 0
 self.tally = 0

but it could also be done like so:

 class TestClass1(object):
  please give me a better name
 name = 
 answer = 
 strength = 20
 wealth = 45
 light = 0
 tally = 0
 def __init__(self,name=Zed):
 please document me
 self.name = name
 ...etc.

I realize that the two are NOT equivalent if you're using the class as
a static class, rather than instantiating it (e.g. using a static
class called Global while weaning oneself from global variables...)
However, I'm asking about this present case: the class under
discussion will always be instantiated.  It seems to me that declaring
the attributes in the class body makes the class more amenable to
introspection, but are there downsides I'm not seeing?  What's the
best practice?

/quote

I've tried both ways and can't see any difference between
the two as far as input/output is concerned.

Best practice?
-- 
b h a a l u u at g m a i l dot c o m
You assist an evil system most effectively by obeying its
orders and decrees. An evil system never deserves such
allegiance.  Allegiance to it means partaking of the evil.
A good person will resist an evil system with his or her
whole soul. [Mahatma Gandhi]
___
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] designing POOP

2008-02-07 Thread Kent Johnson
bhaaluu wrote:

 The TDD method is the method used in my tutorial:
 Python Programming for the Absolute Beginner 2E. Michael Dawson. 2006.
 Dawson uses a very simple Tamagotchi example called Critter Caretaker
 to introduce the mechanics of POOP. However, perhaps he is using
 the TDD method of design?

I don't think Dawson uses TDD. AFAIK he doesn't talk about unit-testing 
at all, which is the fundamental practice of TDD. For an example of unit 
tests in Python, see
http://docs.python.org/lib/minimal-example.html

 here is
 a first little testing snippet from the testing directory, using the TDD
 method. I'm confident that if I am using the terminology incorrectly,
 someone will point out the error of my ways. 

I think you are using the terminology incorrectly. I would call this an 
example of experimental programming, maybe. A classic example of TDD in 
Java is here:
http://junit.sourceforge.net/doc/testinfected/testing.htm

 class TestClass1(object):
  please give me a better name
 def __init__(self):
 please document me
 self.name = 
 self.answer = 
 self.strength = 20
 self.wealth = 45
 self.light = 0
 self.tally = 0

This is a good example of a data class - a class that is just a 
container for data. That is a code smell. It seems to contain unrelated 
values - name and strength are attributes of the player, light is an 
attribute of the environment. So it should probably be more than one 
class, or, since the entire program is in one loop, these could just be 
local variables of main().

 def main():
 tc1 = TestClass1() # instance
 tc1.__init__() # invoke method

The __init__() method is called implicitly by calling TestClass1(). 
Generally the only time you explicitly call __init__() is when calling 
the method of a base class.

Kent
___
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] designing POOP

2008-02-07 Thread bhaaluu
On Feb 7, 2008 4:58 PM, Eric Brunson [EMAIL PROTECTED] wrote:
 bhaaluu wrote:
  What is the equivalent of JUnit in Python? The article says that JUnit is
  used for unit tests, or you can write your own. Since I don't have a clue,
  writing my own is probably out the question. Also I'm not familiar with
  Java, and am just learning Python OOP, so I'm not getting much out
  of that one. Sorry. Absolute Beginner here.
 

 http://www.google.com/search?q=python+unit+test

 Cleverly called unittest, though sometimes referred to by its original
 project name PyUnit.

 :-)


Cool!
http://docs.python.org/lib/module-unittest.html

The Python unit testing framework, sometimes referred to as ``PyUnit,'' is
a Python language version of JUnit, by Kent Beck and Erich Gamma. JUnit is,
in turn, a Java version of Kent's Smalltalk testing framework. Each is the de
facto standard unit testing framework for its respective language.

Who would have thunk it?
I'll Google and see if I can find a nice PyUnit tutorial.

So, is my first try dong a unit test a total bit-bucket case?
No way to make a test case out of it?
That would be a good example (for me). 8^D
-- 
b h a a l u u at g m a i l dot c o m
You assist an evil system most effectively by obeying its
orders and decrees. An evil system never deserves such
allegiance.  Allegiance to it means partaking of the evil.
A good person will resist an evil system with his or her
whole soul. [Mahatma Gandhi]
___
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] A bit about python culture

2008-02-07 Thread bhaaluu
On Feb 7, 2008 5:44 AM, Michael Bernhard Arp Sørensen
[EMAIL PROTECTED] wrote:
 Greetings Masters.

 I was wondering if there's a well know word for python programmers, that is
 usable as a domain name. Unfortunately, pug.dk, as in python user group,
 Denmark, is unavailable here in Denmark.

 I hope to acquire a national domain name and let future local user groups
 choose their own third level domain name.

 Any ideas are welcome.

 --
 Kind regards

 Michael B. Arp Sørensen
  Programmer / BOFH

 I am /root and if you see me laughing you better have a backup.
 ___
 Tutor maillist  -  Tutor@python.org
 http://mail.python.org/mailman/listinfo/tutor


Your best bet might be to look at the old comedy sketches
of Monty Python's Flying Circus. I've found several of their
skits on YouTube. A couple of the more well known sketches
are the Cheese Shop and  the Dead Parrot, but there are
others that may also be a source of ideas for names of a
Python Programming domain.

Even though the logo for many Python Programming sites
is a python snake, the Python Programming language was
named after the British comedy troupe.

Happy Happy Joy Joy.
-- 
b h a a l u u at g m a i l dot c o m
You assist an evil system most effectively by obeying its
orders and decrees. An evil system never deserves such
allegiance.  Allegiance to it means partaking of the evil.
A good person will resist an evil system with his or her
whole soul. [Mahatma Gandhi]
___
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] designing POOP

2008-02-07 Thread bhaaluu
Greetings,

I've read both Kent's and Alan's approaches to designing a POOP,
and am intrigued with the possibilities of the noun/verb/adjective
technique, but am also sympathetic to the TDD method as well
because it is how I've always programmed. I have noted Alan's
comments on the limitations of TDD, as well as the limitations
of the noun/verb/adjective method of design.

The TDD method is the method used in my tutorial:
Python Programming for the Absolute Beginner 2E. Michael Dawson. 2006.
Dawson uses a very simple Tamagotchi example called Critter Caretaker
to introduce the mechanics of POOP. However, perhaps he is using
the TDD method of design?

I'm still experimenting with the noun/verb/adjective design technique,
but I was also itching to get started on something as well, so here is
a first little testing snippet from the testing directory, using the TDD
method. I'm confident that if I am using the terminology incorrectly,
someone will point out the error of my ways. The Tutors are always
saying they really can't help unless they see some code, so this is
a simple adventure game that involves switching a light on and off.
The gameplay isn't all that great, but it is a start. 8^D

#!/user/bin/python

From the testing laboratory of:
b h a a l u u at g m a i l dot c o m
2008-02-07


import time

CS = \n*50

class TestClass1(object):
 please give me a better name
def __init__(self):
please document me
self.name = 
self.answer = 
self.strength = 20
self.wealth = 45
self.light = 0
self.tally = 0

def main():
tc1 = TestClass1() # instance
tc1.__init__() # invoke method
print CS
N1 = tc1.name
N1 = raw_input( WHAT IS YOUR NAME, EXPLORER? )
# main game loop
while True:
print CS
print ( %s, YOUR STRENGTH IS %d) % (N1, tc1.strength)
print ( YOU HAVE $%d) % tc1.wealth
if tc1.light == 0:
print ( IT IS TOO DARK TO SEE ANYTHING)
else:
print ( THE LIGHT'S ON, BUT NO ONE'S HOME)
print
print
A = tc1.answer
A = raw_input( WHAT DO YOU WANT TO DO? [Q|L]: ) # main game prompt
if A.upper() == Q:
break
if A.upper() == L:
light = raw_input( LIGHT? [0|1]: ) # turn the light on and off
if light == 0 and tc1.light == 0:
print ( THE LIGHT IS OFF)
time.sleep(2)
if tc1.wealth = 0:
print
print ( YOU HAVE NO MONEY)
time.sleep(2)
else:
tc1.light = int(light)
tc1.wealth -= 15
else:
print ( INVALID CHOICE)
time.sleep(2)
tc1.tally += 1
tc1.strength -= 5
if tc1.strength = 0:
print ( YOU DIED)
time.sleep(2)
break
print
print ( Final Score:)
print (Tally: %d) % tc1.tally
print (   Wealth: $%d) % tc1.wealth
print ( Strength: %d) % tc1.strength

if __name__ == __main__:
main()


On Feb 7, 2008 4:15 AM, Alan Gauld [EMAIL PROTECTED] wrote:
 Kent Johnson [EMAIL PROTECTED] wrote

  Let me say that I don't mean any disrespect for Alan or his
  approach, I
  just have a different point of view.

 Heh, heh! I was waiting for someone to post a message like this.
 I'll respond by saying the noun/verb thing is not actually the
 method I would normally use (although when all else fails I
 do drop back to it as a starter technique). However I have found
 it to be a techhnique that woerks well for beginners who don't
 know how to get started. Partly because it is fairly mechanistic.

 But noun/verb does have some problems and often produces
 designs that have too many classes and that do not make
 best use of OOP idioms like polymorphism or abstraction.
 But for beginners and in small problems it is a good starter.

  Also I will say that converting a procedural program to OO 'just
  because' is not necessarily a good idea. Not every program is
  improved
  by OOP. In your case, it probably will be though.

 This is absolutely true. Too many people approach OOP as
 if it were some kind of holy grail that is inherently better
 than other styles - it isn't, its just another tool in the toolkit.

  I tend to work from small pieces to larger ones and let the design
  grow
  from the needs of the code, rather than from considerations of nouns
  and
  verbs in the spec.

 I agree at the micro level and in fact my discussion of
 explorers and monsters merging into a figher superclass
 hopefully illustrates how that micro level design/code cycle
 can generate new features of a design including new
 classes/objects. Many OO Design gurus have commented
 on the way that OO design tends to cycle between top down
 design - identifying core classes - and bottom up design - writing
 the lowest building blocks and using that to discover more
 about the higher level needs.

 OO 

Re: [Tutor] designing POOP

2008-02-07 Thread bhaaluu
On Feb 7, 2008 4:07 PM, Kent Johnson [EMAIL PROTECTED] wrote:
 bhaaluu wrote:

  The TDD method is the method used in my tutorial:
  Python Programming for the Absolute Beginner 2E. Michael Dawson. 2006.
  Dawson uses a very simple Tamagotchi example called Critter Caretaker
  to introduce the mechanics of POOP. However, perhaps he is using
  the TDD method of design?

 I don't think Dawson uses TDD. AFAIK he doesn't talk about unit-testing
 at all, which is the fundamental practice of TDD. For an example of unit
 tests in Python, see
 http://docs.python.org/lib/minimal-example.html

  here is
  a first little testing snippet from the testing directory, using the TDD
  method. I'm confident that if I am using the terminology incorrectly,
  someone will point out the error of my ways.

 I think you are using the terminology incorrectly. I would call this an
 example of experimental programming, maybe. A classic example of TDD in
 Java is here:
 http://junit.sourceforge.net/doc/testinfected/testing.htm

What is the equivalent of JUnit in Python? The article says that JUnit is
used for unit tests, or you can write your own. Since I don't have a clue,
writing my own is probably out the question. Also I'm not familiar with
Java, and am just learning Python OOP, so I'm not getting much out
of that one. Sorry. Absolute Beginner here.


  class TestClass1(object):
   please give me a better name
  def __init__(self):
  please document me
  self.name = 
  self.answer = 
  self.strength = 20
  self.wealth = 45
  self.light = 0
  self.tally = 0

 This is a good example of a data class - a class that is just a
 container for data. That is a code smell. It seems to contain unrelated
 values - name and strength are attributes of the player, light is an
 attribute of the environment. So it should probably be more than one
 class, or, since the entire program is in one loop, these could just be
 local variables of main().

Well, most of these were local variables in main() in the procedural
version of this program. So DataClass() is what I should name such
a class. I was wondering about that. These variables were all initialized
in the procedural program before the loop started. Also, the Castle
was setup as part of the initialization, but I'm not dealing with that
here. I'm just trying to learn how to design here. I figured I'd put the
Castle setup in it's own class because it is an object (using the
model as a real-world object method). I don't think I can worry
about whether the CodeSmells at this point. I'm thinking I need
to design something that works, then be able to refactor it to
eliminate as many CodeSmells as I can. But! Noted: a DataClass
is a CodeSmell.


  def main():
  tc1 = TestClass1() # instance
  tc1.__init__() # invoke method

 The __init__() method is called implicitly by calling TestClass1().
 Generally the only time you explicitly call __init__() is when calling
 the method of a base class.

I can fix that right now! Back to the laboratory! 8^D


 Kent


Happy Programming!
-- 
b h a a l u u at g m a i l dot c o m
You assist an evil system most effectively by obeying its
orders and decrees. An evil system never deserves such
allegiance.  Allegiance to it means partaking of the evil.
A good person will resist an evil system with his or her
whole soul. [Mahatma Gandhi]
___
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] designing POOP

2008-02-07 Thread Eric Brunson
bhaaluu wrote:
 What is the equivalent of JUnit in Python? The article says that JUnit is
 used for unit tests, or you can write your own. Since I don't have a clue,
 writing my own is probably out the question. Also I'm not familiar with
 Java, and am just learning Python OOP, so I'm not getting much out
 of that one. Sorry. Absolute Beginner here.
   

http://www.google.com/search?q=python+unit+test

Cleverly called unittest, though sometimes referred to by its original 
project name PyUnit.

:-)
___
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] designing POOP

2008-02-07 Thread Kent Johnson
bhaaluu wrote:
 What is the equivalent of JUnit in Python? 

The unittest module is based on JUnit.
http://docs.python.org/lib/module-unittest.html

Here is a simple introduction to the capabilities of unittest. It 
doesn't do much to motivate the examples though:
http://www.oreillynet.com/onlamp/blog/2007/09/pymotw_unittest.html

A longer intro:
http://agiletesting.blogspot.com/2005/01/python-unit-testing-part-1-unittest.html

An alternative to unittest is doctest. They both get the job done, which 
one to use is mostly a matter of preference and the complexity of the tests.
http://docs.python.org/lib/module-doctest.html

Wikipedia has a short introduction to doctest and a link to Tim Peter's 
c.l.py posting introducing the module:
http://en.wikipedia.org/wiki/Doctest
http://groups.google.com/group/comp.lang.python/msg/1c57cfb7b3772763

Another intro:
http://agiletesting.blogspot.com/2005/01/python-unit-testing-part-2-doctest.html

There are many other testing tools that are not in the standard library. 
Nose and py.test are popular alternatives to unittest and doctest.
http://agiletesting.blogspot.com/2005/01/python-unit-testing-part-3-pytest-tool.html

Here is a good list of testing articles:
http://www.pycheesecake.org/wiki/AgileTestingArticlesAndTutorials

Here is a pretty comprehensive list of tools:
http://pycheesecake.org/wiki/PythonTestingToolsTaxonomy

Kent
___
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] designing POOP

2008-02-07 Thread Alan Gauld

bhaaluu [EMAIL PROTECTED] wrote

 What is the equivalent of JUnit in Python?

I think the nearest equivalent is

 writing my own is probably out the question. Also I'm not familiar 
 with
 Java, and am just learning Python OOP, so I'm not getting much out
 of that one. Sorry. Absolute Beginner here.

Note that Unit testing is orthogonal to OOP.
You can use TDD and unit tests(and should!) when
doing procedural programming just as well.


 Well, most of these were local variables in main() in the procedural
 version of this program. So DataClass() is what I should name such
 a class. I was wondering about that.

While you can use classes that way it leads to a style of
programming called object based rather than object oriented.
It uses objects but the underlying design is still procedural.
Thats why its better to focus on the behaviour of the objects
and add the data attributes needed to support that behaviour.
Remember we communicate with objects by sending them
messages asking them to *do* stuff not to get data out of
them, or at least we should do.
Objects do it to themselves: The Law of demeter.
Ask What does this object do? What data does it need to
achieve that?

 Castle setup in it's own class because it is an object (using the
 model as a real-world object method).

Yes, each object should initialise its own data.
(Albeit maybe based on values passed into the constructor.)

HTH,

Alan G. 


___
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] designing POOP

2008-02-07 Thread Alan Gauld

Alan Gauld [EMAIL PROTECTED] wrote 

 What is the equivalent of JUnit in Python?
 
 I think the nearest equivalent is
 

Oops, I was going top say PyUnit then remembered the name 
had changed but forgot to check out the latest incarnation.
Fortyunately others have done the work for me.

Personally I like the Nose framework that comes with 
TurboGears but even hand written unit tests are no big 
deal in Python - just use asserts and other invariant 
checks and tests etc liberally 

Alan G.

___
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] designing POOP

2008-02-07 Thread bhaaluu
On Feb 7, 2008 6:47 PM, Alan Gauld [EMAIL PROTECTED] wrote:

 Alan Gauld [EMAIL PROTECTED] wrote

  What is the equivalent of JUnit in Python?
 
  I think the nearest equivalent is
 

 Oops, I was going top say PyUnit then remembered the name
 had changed but forgot to check out the latest incarnation.
 Fortyunately others have done the work for me.

 Personally I like the Nose framework that comes with
 TurboGears but even hand written unit tests are no big
 deal in Python - just use asserts and other invariant
 checks and tests etc liberally


 Alan G.

PyUnit:
It really doesn't seem to be an absolute beginner technique.
The noun/verb/adjective technique seems to be geared
more towards beginners. I like the idea of that technique.
Perhaps the unit test approach is more for Intermediate
learners, or learners who already have a background in
OOP of some form or another (like Java). I'm just starting out,
so I'm looking at everything that is thrown at me, but quite
frankly, it is really easy for me to see something that is over
my head at this point. If it's over my head, I'll just stall, like
I have in the past, and then I'll have to start this thread over
again later. sigh 8^D

I guess you can tell it's been a long day for me. I've done
some reading, some coding, some experimenting... all in
a day's play for a Hobbyist Programmer. 8^D

I'll take another look at PyUnit tomorrow morning
when I'm fresh.

One thing I'm encouraged by: in Alan's tutorial, he
says that I don't have to see the light to use POOP.
But if I can learn some basic design POOP techniques
from all this, then I'll be happy. After all, I'm a beginner...
you can't get any more basic than that!

Happy Happy Joy Joy.
-- 
b h a a l u u at g m a i l dot c o m
You assist an evil system most effectively by obeying its
orders and decrees. An evil system never deserves such
allegiance.  Allegiance to it means partaking of the evil.
A good person will resist an evil system with his or her
whole soul. [Mahatma Gandhi]
___
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] Pixelize ubuntu python script acting odd.

2008-02-07 Thread Tiger12506
Some suggestions throughout

 def runThrough():
walk = os.walk(/media/sda1/Documents/Pictures/2007) #location of the 
 pics I want to use
count = 0
for root, dirs, files in walk:
try:
for x in files:
if x.lower().find(.jpg) -1: #If it's a .jpg...

This could be
if x.lower().endswith(.jpg):

count = count + 1
operation = 'make_db ' + root + '/' +  x

This could be also
operation = make_db %s/%s % (root,x)

os.system(operation) # Call the command line with the 
 operation above
print root + '/' + x #This is optional, I did this for 
 debugging
print %s/%s % (root,x)

print str(count) +  files done
print %s files done % count

except OSError:
print root + / + x +  was not included in the list
#This was run to get rid of all the obnoxious spaces in the file 
 names
#try:
#for x in files:
#loc = root + '/' + x
#pic = loc.replace(' ', _)
#os.rename(loc, pic)
#count = count + 1
#print str(count) + files done
#except OSError:
#print root + '/' + x +  was not included

I don't know much about ubuntu, so I can't answer the question. Also you 
might consider os.path.join
And since you are doing this root+'/'+x so many times, perhaps you should 
just assign it to a variable once
and use it instead? Say~  fullpath = root+'/'+x 

___
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] Anyone fancy giving me some tips and an expert opinion??

2008-02-07 Thread Tiger12506
I'll throw in a couple of ideas, but I won't pretend to be an expert. ;-)


I have written what i see as a pretty decent script to resolve this
 question:

 Write an improved version of the Chaos program from Chapter 1 that allows 
 a
 user to input two initial
 values and the number of iterations and then prints a nicely formatted 
 table
 showing how the values
 change over time. For example, if the starting values were .25 and .26 
 with
 10 iterations, the table
 might look like this:
 index 0.25 0.26
 
 1 0.731250 0.750360
 2 0.766441 0.730547
 3 0.698135 0.767707
 4 0.821896 0.695499
 5 0.570894 0.825942
 6 0.955399 0.560671
 7 0.166187 0.960644
 8 0.540418 0.147447
 9 0.968629 0.490255
 10 0.118509 0.974630

 Although it works I am sure I could have gone about this a better way, it
 probably doesn't fit all the rules of best practice either. Was wondering 
 if
 anyone would mind having a look and offering a few tips??

 # chaos.py
 # A program to mimic the chaos theory

 def main():

print Example of Chaos

# User inputs numbers to compare, z is for the index counter
x = input(Enter a number between 1 and 0: )
y = input(Enter a second number between 1 and 0: )

Generally, additional checks are made to make sure that the values actually 
are within the proper range, but I wouldn't think that would be necessary in 
such a specific script.

z = 0

# Prints the table borders and titles
print '%10s %20s %20s' % (Index, x, y)
print --

Can be
print - * 58

tempx = x
tempy = y

You never use x and y again. Why are you changing variables to tempx and 
tempy?


# Loops calculates 'chaotic behaviour for input numbers
for i in range(10):
tempx = 3.9 * tempx * (1 - tempx)
tempy = 3.9 * tempy * (1 - tempy)
z = z + 1
# Print chaotice results into table
print '%10s %20s %20s' % (z, tempx, tempy)

raw_input(Press any key to exit)

 main()

This is really so short of a script, I wouldn't change the design, but some 
general tips to think about follow...

My biggest worry is whether or not you will change how you print your 
results in a larger piece of code. For example. If you notice, when you 
print out your columns, you have %10s %20s %20s in two different places. 
What if you wanted to change the code so that the first column was padded to 
fifteen characters instead of just 10? You would have to change it in all of 
those places and if you missed one~ bam! Bug. The easy way to fix that is to 
assign the pattern to a variable and then you only have to change it once.

pat = %10s %20s %20s
print pat % (z,x,y)

Will still work. ;-)

The only other issue I have with this is the issue of the Z counter. In your 
loop you allow i to be a counter from 0 to 9. Why don't you take advantage 
of that? Get rid of the z variable entirely and just use 'i'.

A nice script though. Keep going. 

___
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] Anyone fancy giving me some tips and an expert opinion??

2008-02-07 Thread Kent Johnson
Damian Archer wrote:
 # User inputs numbers to compare, z is for the index counter
 x = input(Enter a number between 1 and 0: )
 y = input(Enter a second number between 1 and 0: )

We generally discourage the use of input(), it is (arguably) a security 
hole -
http://www.wellho.net/mouth/956_Python-security-trouble-with-input.html
and a rather contentious discussion on this very list -
http://mail.python.org/pipermail/tutor/2007-August/056328.html
- and it doesn't validate the input. A better way to write this would be

 x = float(raw_input(Enter a number between 1 and 0: ))
 y = float(raw_input(Enter a second number between 1 and 0: ))

which is safer and guarantees that x and y are floating point numbers.

Kent
___
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] designing POOP

2008-02-07 Thread Tiger12506
There's a couple of errors in here that no one has addressed yet because the 
question was geared towards programming style... So now I will address them. 
Or undress them, I suppose. ;-)

 #!/user/bin/python
 
From the testing laboratory of:
 b h a a l u u at g m a i l dot c o m
 2008-02-07
 

 import time

 CS = \n*50

This is okay, but it is a little more intuitive to make this
def clrscr():
  print \n*50

so that you can say
clrscr()

because clearing the screen is an action, not a thing that you would 
normally think of printing. The point of python is to make programming 
easier for humans. You defeat it's greatest power by not using it in a style 
that takes advantage of it's ability to mimic the real world. actions 
usually indicate functions.  (This is definitely a style thing. I'm not 
trying to start an argument)

 class TestClass1(object):
 please give me a better name
def __init__(self):
please document me
self.name = 
self.answer = 
self.strength = 20
self.wealth = 45
self.light = 0
self.tally = 0

As mentioned before, data in class should be related to one real (or 
abstract) object, not just a container for random data.

 def main():
tc1 = TestClass1() # instance
tc1.__init__() # invoke method
print CS
N1 = tc1.name
N1 = raw_input( WHAT IS YOUR NAME, EXPLORER? )

This is pointless. When you assign the value of tc1.name (which is ) you 
immediately overwrite it when you say N1 = raw_input(...) What you are 
trying to accomplish without grokking assignment is this.

tc1.name = raw_input(What is your name, explorer?)

# main game loop
while True:
print CS
print ( %s, YOUR STRENGTH IS %d) % (N1, tc1.strength)

Earlier you set N1, but not tc1.name. Either use one or the other.

print ( YOU HAVE $%d) % tc1.wealth
if tc1.light == 0:

Can be
if tc1.light:
  print(The light's on, but no one's home)
else:
  print(It is too dark to see anything)

print ( IT IS TOO DARK TO SEE ANYTHING)
else:
print ( THE LIGHT'S ON, BUT NO ONE'S HOME)
print
print
A = tc1.answer

Again, the same problem with tc1.name. Why are you bothering with A? Please 
realize that you can assign directly

tc1.answer = raw_input(...)

and just use the one variable. This is not C, but Python.

A = raw_input( WHAT DO YOU WANT TO DO? [Q|L]: ) # main game 
 prompt
if A.upper() == Q:
break
if A.upper() == L:
light = raw_input( LIGHT? [0|1]: ) # turn the light on and 
 off
if light == 0 and tc1.light == 0:

What?!? What is the deal? Do you have two different lights? No... then using 
two different light variables does not make sense. Also, the variable 
'light' will never be == 0 unless you hit enter without entering anything 
because raw_input returns a string. 0 != 0

print ( THE LIGHT IS OFF)

I see. You have two seperate variables so that you can determine whether the 
light was off previously. In which case, I suggest you change the variable 
to a more intuitive name, such as 'chosen' or something. To test whether the 
light was on before or not, you should have a method of the class 
islighton() because you are performing an action. Checking to see whether 
the light is on. If this doesn't make sense to you, consider that often 
attributes of a class are not directly accessed. There are even special 
things called properties that define get and set methods of classes... Um, 
disregard that. Too much info. :-)

time.sleep(2)
if tc1.wealth = 0:

You have put this wealth check after the changing of the light. So it is 
possible that someone can change the light after they already have no money.

print
print ( YOU HAVE NO MONEY)
time.sleep(2)
else:
tc1.light = int(light)

Good. You just didn't think of int() in the if check. btw, you aren't going 
to tell anyone when they turn the light on?

tc1.wealth -= 15
else:
print ( INVALID CHOICE)
time.sleep(2)
tc1.tally += 1
tc1.strength -= 5
if tc1.strength = 0:
print ( YOU DIED)
time.sleep(2)
break
print
print ( Final Score:)
print (Tally: %d) % tc1.tally
print (   Wealth: $%d) % tc1.wealth
print ( Strength: %d) % tc1.strength

 if __name__ == __main__:
main()

___
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor


[Tutor] Cobra

2008-02-07 Thread Dick Moores
Peter Dilley posted these links on the python-list a few hours ago. 
Cobra looks VERY interesting to me.

Comparison to Python:
http://cobra-language.com/docs/python/

Main Page:
http://cobra-language.com/

Article that first caught my eye regarding Cobra:
http://www.computerworld.com.au/index.php/id;342684174;fp;16;fpid;1

Dick Moores

___
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor