在Python中,我们希望使用用户输入作为函数

2024-04-26 03:02:33 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python中,我想使用用户输入作为函数调用。特别是,我正在测试以下代码:

def forward(forwardValue):
    print("in forward, with value " + forwardValue)
    return

command = 'forward'  # this would come in as user input
value = '255'
command(value)

我想看到的是一个打印输出,上面写着:in forward,值255

我看到的是一个错误:

'str' object is not callable

这个错误消息是有意义的,我可以理解为什么我测试的东西不起作用,但是有什么方法可以做我想做的吗?换句话说,用户输入可以用作函数调用吗?你知道吗

我现在做的是使用“if”语句来检查用户输入是否是“forward”语句,如果是,则调用函数“forward”。但如果可能的话,我想变得更像Python。你知道吗

我有一个用户可以使用的大约30个不同命令的列表,每个命令都有一个定义的函数来处理它。我的一系列30个“如果”和“elif”的陈述看起来很笨拙。你知道吗


Tags: 代码用户in命令returnvaluedef错误
2条回答

Daanii,似乎吸引您的是,名为command的变量包含字符串“forward”。此字符串对象不是您的函数。使用if语句,正如您所说的,是最直接的方法。你知道吗

如果您有许多函数和/或不一定希望函数名和用户传递的字符串匹配,那么我建议使用字典。你知道吗

d = {'foward':forward, 'backward':backward, 'flurb':durf}

def forward(forwardValue):
    print("in forward, with value " + forwardValue)
    return

def backward(backwardValue):
    print("in backward, with value " + backwardValue)
    return

def durf(value):
    print("in durf, with value " + value)
    return

try:
    command = raw_input('Enter your thing:\n')
    value = '255'
    d[command](value)
except KeyError:
    print 'The user did not enter a valid string'

又快又脏的解决方案

使用globals()

globals()[command](value)

更明智的方法

但是,如果安全性是一个问题,您可能希望限制可以从用户输入调用的内容。例如,定义可调用函数的字典:

functions = {'forward': forward, 'othercommand': othercommand}

或与之前的解决方案结合使用以避免重复:

functions = {k: globals()[k] for k in ('forward', 'othercommand')}

然后调用函数:

functions[command](value)

替代方法

可以使用类作为用户可调用函数的命名空间:

class Functions:
    @staticmethod
    def forward(arg):
        print("in forward, with value " + forwardValue)
    @staticmethod
    def othercommand():
        pass

(如果您使用的是python3.x,@staticmethod在此上下文中是可选的)

然后使用getattr()访问静态方法:

getattr(Functions, command)(value)

相关问题 更多 >