<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 <small> <i> This notebook was prepared by Marco Guajardo. For license visit github </i> </small>
.
Challenge Notebook
Problem
Step1:  Unit Test
<b> The following unit test is expected to fail until you solve challenge </b>
<ASSISTANT_TASK:>
Python Code:
def reverse_words (S):
    #TODO: implement me
    pass 
Explanation: <small> <i> This notebook was prepared by Marco Guajardo. For license visit github </i> </small>
.
Challenge Notebook
Problem: Given a string of words, return a string with the words in reverse
Constraits
Test Cases
Algorithm
Code
Unit Test
Solution Notebook
Constraints
Can we assume the string is ASCII?
Yes
Is whitespace important?
no the whitespace does not change
Is this case sensitive?
yes
What if the string is empty?
return None
Is the order of words important?
yes
Test Cases
Empty string -> None
"the sun is very hot" -> "eht nus si yrev toh"
Algorithm
Refer to the Solution if you are stuck and need a hint, the solution notebook's algorithm discussion might be a good place to start.
Code
End of explanation
from nose.tools import assert_equal
class UnitTest (object):
    def testReverseWords(self):
            assert_equal(func('the sun is hot'), 'eht nus si toh')
            assert_equal(func(''), None)
            assert_equal(func('123 456 789'), '321 654 987')
            assert_equal(func('magic'), 'cigam')
            print('Success: reverse_words')
            
def main():
    test = UnitTest()
    test.testReverseWords()
if __name__=="__main__":
  main()
Explanation: Unit Test
<b> The following unit test is expected to fail until you solve challenge </b>
End of explanation
<END_TASK>