Python call function from user input

前端 未结 3 1671
长发绾君心
长发绾君心 2021-01-03 13:40

Can you call functions from user input? Something like this:

def testfunction(function):
    function()

a = raw_input(\"fill in function name: \"
testfuncti         


        
相关标签:
3条回答
  • 2021-01-03 14:15

    I would probably encapsulate this kind of behavior in a class:

    class UserExec(object):
        def __init__(self):
            self.msg = "hello"
        def get_command(self):
            command = str(raw_input("Enter a command: "))
            if not hasattr(self, command):
                print "%s is not a valid command" % command
            else:
                getattr(self, command)()
        def print_msg(self):
            print self.msg
    a = UserExec()
    a.get_command()
    

    As others have said, this is a security risk, but the more control you have over the input, the less of a risk it is; putting it in a class that includes careful input vetting helps.

    0 讨论(0)
  • 2021-01-03 14:16

    What you are doing is bad bad bad :P However, it's perfectly possible.

    a = raw_input("Fill in function name:")
    if a in locals().keys() and callable(locals()['a']):
        locals()['a']()
    else:
        print 'Function not found'
    

    locals() returns a dictionary of all the objects currently avalible, and their names. So when we say a in locals().keys() we are saying, "Is there any object called ". If there is, we then get it by doing locals()['a'] and then test if it is a function using callable. If that is True aswell, then we call the function. If it is not, we simply print "Function not found".

    0 讨论(0)
  • 2021-01-03 14:21

    Yes you can, though this is generally a bad idea and a big security risk.

    def testfunc(fn):
        fn()
    
    funcname = raw_input('Enter the name of a function')
    if callable(globals()[funcname]):
        testfunc(globals()[funcname])
    
    0 讨论(0)
提交回复
热议问题