[Tutor] Fraction Class HELP ME PLEASE!

Cameron Simpson cs at zip.com.au
Thu Aug 6 23:44:32 CEST 2015


On 06Aug2015 16:55, Quiles, Stephanie <stephanie.quiles001 at albright.edu> wrote:
>I need to do the following assignment. I need to know how do i hard code an 
>example for each of the operators I am implementing? What i have so far is 
>below? He said he does not care if we plug in some numbers or if we have user 
>input numbers, however I am unsure of how to write a program that tests each 
>operator? Or can i write one that tests all of them? I don’t know where to 
>start with this. Please help!

For someone who doesn't know where to start, you seem to have a lot of decent 
looking code. Is the code below all yours? If so, a good start.

Also, please try to preserve the indentation when pasting in code; indentation 
is critical in Python as you know and incorrect indentation, when not an 
outright syntax error, can be a source of bugs. I'll presume your code was 
originally indented correctly.

Note that in this list we _do_ like code to be pasted inline where it can be 
seen directly and commented on like any other part of the message text. We're 
not big on attachments or links to external things (other than doco citations 
like your reference to the operators Python page).

>You may implement as many of these operators as you like (such as isub,
>itruediv, etc.) You MUST indicate in your header information which operators
>you are implementing, and you MUST hard code an example for each.

"Header information" is usually an opening comment. So perhaps start the 
program with text like this:

  # Here is a Fraction class implementing variaous operators. It currently
  # supports:
  #
  # + (addition)
  # - (subtraction)
  # * (multiplication)
  # / (true division)
  #

and so forth.

Regarding examples and tests, one workable approach to to make your program 
work as a "main program". The idea is that is invoked as a main program it will 
run the examples or tests.

As your code sits now it could be used as a module - someone could place it 
into python's library tree and import it, and use your Fraction class.  
However, you can of course run it directly at the command prompt, eg:

  % python your-fraction-file.py

When you do that, the code is still imported as a module but with the special 
name '__main__'. So what a lot of python modules do is have a "main" function 
which is to be fired only in the command line circumstance, such as:

  def main():
    F1 = Fraction(1, 2)     # 1/2
    F2 = Fraction(2, 3)     # 2/3
    print("F1 =", F1)
    print("F2 =", F2)
    print("F1 + F2 =", F1 + F2)
    print("F1 - F2 =", F1 - F2)
    print("F1 * F2 =", F1 * F2)

In order to make your program work as both an importable module which defines 
the Fraction class but does not run the main function and also as a main 
program which defines the class and then runs the main function you put this 
piece of boilerplate code on the very bottom of the program:

  if __name__ == '__main__':
    main()

which checks if you're invoking it directly from the command line. If so, run 
the main function.

Hopefully that gives you an idea about hardwiring examples also.

Regarding tests, you might write a simple function like this:

  def check(label, computed, expected):
    ok = computed == expected
    if ok:
      print(label, 'OK', computed, '==', expected)
    else:
      print(label, 'BAD', computed, '!=', expected)
    return ok

Then you might consider modifying your main program to run tests instead of 
bare examples, replacing:

  print("F1 + F2 =", F1 + F2)

with:

  check("F1 + F2", F1 + F2, Fraction(7, 6))

Because check() returns whther the check was ok, you might even count the 
number of failures for some kind of report:

  fail_count = 0
  ...
  if not check("F1 + F2", F1 + F2, Fraction(7, 6)):
    fail_count += 1
  ... more checks ...
  print(fail_count, "failures")

and so forth.

This also gets you test code so that you can test your own program for 
correctness before submitting your assignment.

Feel free to return to this list with updated code and new questions.

Cheers,
Cameron Simpson <cs at zip.com.au>


More information about the Tutor mailing list