2

I have started working with the google Python class but I am getting some odd results and a full day of debugging hasn't help me resolve it.

What seems to be happening is that the functions are returning None instead of the values I am assigning them, but why this is happening is eluding me. I wrote in some debug lines and tried to step through it but I am seeing what is causing the behaviour.

Here is a sample of some of the debug output:

C:\Users\toshiba\Dropbox\DEV\python\google-python-exercises\basic>python string2.py
front_back
  X  got: None expected: 'abxcdy'
 OK  got: 'abcxydez' expected: 'abcxydez'
 OK  got: 'KitDontenut' expected: 'KitDontenut'

The code is from googles class and then the functions written by me.

# F. front_back
# Consider dividing a string into two halves.
# If the length is even, the front and back halves are the same length.
# If the length is odd, we'll say that the extra char goes in the front half.
# e.g. 'abcde', the front half is 'abc', the back half 'de'.
# Given 2 strings, a and b, return a string of the form
#  a-front + b-front + a-back + b-back
def front_back(a, b):
  # +++your code here+++

  # Debug hardcode setting
  # set to 1 to debug (default 0 off)
  letsDebug = 0

  alpha, bravo = a, b
  if letsDebug == 1:
        endString = a \
        + ' ' \
        + b
        return endString

  lenA = len(alpha)
  lenB = len(bravo)

  if lenA % 2 == 1:
    statAlpha = 'odd'
  else:
    statAlpha = 'even'

  if lenB % 2 == 1:
    statBravo = 'odd'
  else:
    statBravo = 'even'
  if letsDebug == 2:
        endString = a \
        + ' ' \
        + b \
        + ' ' \
        + statAlpha \
        +  ' ' \
        + statBravo 
        return endString

  workB = lenB / 2
  workA = lenA / 2
  if letsDebug == 3:
        endString = a \
        + ' ' \
        + b \
        + ' ' \
        + statAlpha \
        +  ' ' \
        + statBravo \
        + ' ' \
        + str(workA) \
        + ' ' \
        + str(workB) 
        return endString

  if statAlpha == 'even':
    aFront, aBack = alpha[:workA], alpha[-workA:]
  else:
    aFront, aBack = alpha[:(workA+1)], alpha[-workA:]

  if statBravo == 'even':
    bFront, bBack = bravo[:workB], bravo[-workB:]
  else:
    bFront, bBack = bravo[:(workB+1)], bravo[-workB:]

    if letsDebug == 4:
        endString = a \
        + ' ' \
        + str(workA) \
        + ' ' \
        + b \
        + ' ' \
        + str(workB) \
        + ' ' \
        + statAlpha \
        +  ' ' \
        + statBravo \
        + ' ' \
        + aFront \
        + ' ' \
        + bFront \
        + ' ' \
        + aBack \
        + ' ' \
        + bBack \
        + ' ' \
        + aFront + bFront + aBack + bBack
    else:
        endString = aFront + bFront + aBack + bBack

    return endString


# Simple provided test() function used in main() to print
# what each function returns vs. what it's supposed to return.
def test(got, expected):
  if got == expected:
    prefix = ' OK '
  else:
    prefix = '  X '
  print '%s got: %s expected: %s' % (prefix, repr(got), repr(expected))


# main() calls the above functions with interesting inputs,
# using the above test() to check if the result is correct or not.
def main():
  print 'verbing'
  test(verbing('hail'), 'hailing')
  test(verbing('swiming'), 'swimingly')
  test(verbing('do'), 'do')

  print
  print 'not_bad'
  test(not_bad('This movie is not so bad'), 'This movie is good')
  test(not_bad('This dinner is not that bad!'), 'This dinner is good!')
  test(not_bad('This tea is not hot'), 'This tea is not hot')
  test(not_bad("It's bad yet not"), "It's bad yet not")

  print
  print 'front_back'
  test(front_back('abcd', 'xy'), 'abxcdy')
  test(front_back('abcde', 'xyz'), 'abcxydez')
  test(front_back('Kitten', 'Donut'), 'KitDontenut')

if __name__ == '__main__':
  main()

Many thanks to any who can decipher where I have gone ary here.

3
  • A function in python returns None if you're returning nothing from it, or if you explicitly returning None from it. Commented Oct 18, 2012 at 21:44
  • 1
    You should really post only the relevant parts of the code that you want help with. I have edited out the irrelevant parts this time, but for the future, please make sure you do so before you post your question Commented Oct 18, 2012 at 21:45
  • The code failed tests in both not_bad and front_back. You removed too much. Should this be two questions? Or would it be best to readd the other piece? Commented Oct 18, 2012 at 22:34

2 Answers 2

3

You have a path out of the last if in front_back() that is not covered by a return statement. This one:

if statBravo == 'even':
Sign up to request clarification or add additional context in comments.

Comments

1

It looks like the whole block at the end of front_back is indented one too many levels. From if letsDebug == 4: to return endString - this is all part of the else block started above it (the else for the statement if statBravo == 'even':). I'm guessing this is supposed to be at function scope instead.

2 Comments

I went back and reindented the entire function and it worked without code changes. My first battle with the whitespace and it was not fun. I think it must have gotten confused with cutting and pasting and wasn't showing in jedit. I will be trying other editors to see if they handle it better. I am liking sublime text 2, maybe that will prevent this kind of thing from happening so much looking ahead. The idea of trying to track down a space vs a tab in a module with thousands of lines is scary.
I would recommend using an IDE or text editor that can do automatic space/tab conversion and automatic indention. I personally use Eclipse IDE with PyDev, but mostly because I use Eclipse for other languages as well. It automatically converts spaces to tabs (or the other way around) when you paste text, and indents it to the level of the block you pasted into.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.