Trying to use raw input with functions

mrkzam123 picture mrkzam123 · May 2, 2013 · Viewed 14.3k times · Source

I am new to python and I'm trying to make a command kind of thing for a program with raw_input and functions. For some reason it hasn't been working. Here is the code I've been testing with:

raw_input()

def test():
    print "hi, this will be amazing if it works"

Answer

sberry picture sberry · May 2, 2013

raw_input will block until you type something in. When a newline is received (user presses enter) the value will be returned and can be stored. It does not appear you are ever trying to call your function test. Perhaps you want to try something like this (I can explain further if you need it)

name = raw_input("What is your name: ")

def test(username):
    print "Hi %s, this will be amazing if it works" % (username,)

test(name)

Based on your other comments, this is the safe way to do this:

# Define two functions test() and other()
def test():
    print "OMG, it works..."

def other():
    print "I can call multiple functions"

# This will be to handle input for a function we don't have
def fail():
    print "You gave a bad function name.  I only know about %s" % (", ".join(funcs.keys()))

# This is a dictionary - a set of keys and values.  
# Read about dictionaries, they are wonderful.  
# Essentially, I am storing a reference to the function
# as a value for each key which is the value I expect the user to ender.
funcs = {"test": test, "other": other}

# Get the input from the user and remove any trailing whitespace just in case.
target = raw_input("Function to run? ").strip()

# This is the real fun.  We have the value target, which is what the user typed in
# To access the value from the dictionary based on the key we can use several methods.
# A common one would be to use funcs[target]
# However, we can't be sure that the user entered either "test" or "other", so we can 
# use another method for getting a value from a dictionary.  The .get method let's us
# specify a key to get the value for, as wel as letting us provide a default value if
# the key does not exist.  So, if you have the key "test", then you get the reference to 
# the function test.  If you have the key "other", then you get the reference to the 
# function other.  If you enter anything else, you get a reference to the function fail.

# Now, you would normally write "test()" if you wanted to execute test.  Well the 
# parenthesis are just calling the function.  You now have a reference to some function
# so to call it, you have the parenthesis on the end.
funcs.get(target, fail)()

# The above line could be written like this instead
function_to_call = funcs.get(target, fail)
function_to_call()