Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python 3: Making a str object callable

I have a Python program that takes user input. I store user input a string variable called "userInput". I want to be able to call the string the user entered...

userInput = input("Enter a command: ")
userInput()

From this, I get the error: TypeError: 'str' object is not callable

Currently, I have the program doing something like this:

userInput = input("Enter a command: ")
if userInput == 'example_command':
    example_command()

def example_command():
     print('Hello World!')

Clearly this isn't a very efficient way to process a lot of commands. I want to make the str obj callable - anyway to do so?

like image 400
just_a_programmer Avatar asked Apr 20 '14 01:04

just_a_programmer


1 Answers

A better method might be to use a dict:

def command1():
    pass

def command2():
    pass

commands = {
    'command1': command1,
    'command2': command2
}

user_input = input("Enter a command: ")
if user_input in commands:
    func = commands[user_input]
    func()

    # You could also shorten this to:
    # commands[user_input]()
else:
    print("Command not found.")

Essentially, you're providing a mapping between the literal command, and the function you might want to run.

If that's too much typing, you could also use the local keywords, which will return a dictionary of every function, variable, etc. currently defined within the current scope:

def command1():
    pass

def command2():
    pass

user_input = input("Enter a command: ")
if user_input in locals():
    func = locals()[user_input]
    func()

This isn't entirely secure though, because a malicious user could enter a command which is the same as a variable name, or some function you don't want them to run, and end up crashing your code.

like image 95
Michael0x2a Avatar answered Sep 20 '22 03:09

Michael0x2a