A suggestion for a possible Python module
Max M
maxm at mxm.dk
Tue Mar 4 04:42:07 EST 2003
Lance LaDamage wrote:
> ([driveletter]:\[pythondir]\Lib). It is located at
> http://sourcepost.sytes.net/sourceview.aspx?source_id=4105. Tell me what you
> think of it.
Oh ... it just dawned on me that this might not be an attempt at humour.
So my humorous reply earlier today might have been rather out of line.
But the code was so full of errors as to be a guidebook of bad
programming practices that I assumed it to be a humorous post.
Instead I will do a "serious" analysis of the code. I assume you are a
new coder, if not some of my comments might be obvious::
First of, it is overly commented. You take 3 lines of actual code, well
one line in the comming version of python, and turns it into 36 lines.
That is not nessecary.
Here is the relevant code:
import string
# This is the reverse function
def reverse( s ):
if len( what ) != 1: # If the query is not 1 character long
what2 = list( what )
what2.reverse()
return "".join( what2 )
return
else: # If the query is one character long
return "I can't reverse one character"
return
def help():
return "Use StrReverse.reverse(s) to reverse a string"
def credits():
return "Special Thanks to Lance L. LaDamage for making the \
StrReverse module"
First of you import the string module, but you don't use it anywhere. I
assume you used the reverse function in the string module to begin with,
and then found out about the string method, and then forgot to delete
the import. While not harmfull it is sloppy coding.
import string
Also you don't follow the python coding standard by having spaces in
your function calls.
reverse( s )
It should look like:
reverse(s)
"This is the reverse function" is an example of really bad commenting.
You are commenting the obvious. It is just a textual repetition of the
function definition.
# This is the reverse function
Instead you should state the intent of the function. Also you should do
it as a docstring instead.
def reverse( s ):
"Reverse the ordering of letters in a string"
You call your parameter "s". This is not too bad, but perhaps "aString"
would be a better name. At least it is a lot more descriptive.
Here follows the worst mistake. It is a plain bug! If your string has
only one letter, it will not try and reverse it. Instead it will return
another string "I can't reverse one character". This is dangerous in so
many ways!
If you really want it to be an error to try and reverse a 1 char string,
you should raise an exception. Not let the error propagate throughout
your software system. You risk inserting "I can't reverse one character"
strings all over you database or whatever.
if len( what ) != 1: # If the query is not 1 character long
what2 = list( what )
what2.reverse()
return "".join( what2 )
return
else: # If the query is one character long
return "I can't reverse one character"
return
But not reversing one letter strings is a bad idea. It would be
apropriate to expect a reverse function to be reversible.
So that if I tried:
print reverse(reverse('Lance'))
>>> Lance
Which it would do correctly. But why should this be wrong?:
print reverse(reverse('L'))
>>> I can't reverse one character
In the end of your "if" and "else" statements, there are superfluous
return statements that will never be executed. Why is that?
Then there is the "what" and "what2" variables. Those names are not
descriptive. Furthermore they are not declared anywhere, and so will
generate an error when the function is called.
Have you even tried to run the code you have posted?
All in all you the function should probably look something like:
def reverse(aString):
"Reverse the ordering of letters in a string"
list_of_letters = list(aString)
list_of_letters.reverse()
return ''.join(list_of_letters)
It would have all the comments you need, and properly, descriptive named
variables.
--
hilsen/regards Max M Rasmussen, Denmark
http://www.futureport.dk/
Fremtiden, videnskab, skeptiscisme og transhumanisme
More information about the Python-list
mailing list