开发者

Python call function from user input [duplicate]

This question already has answers here: Calling a function of a module by using its name (a string) (18 answers) Closed 2 months ago.

Can you call functions from user inp开发者_C百科ut? Something like this:

def testfunction(function):
    function()

a = raw_input("fill in function name: "
testfunction(a)

So if you fill in an existing function it will execute it.


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".


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.


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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜