如何将用户输入转换为函数参数?

时间:2017-12-22 00:51:37

标签: python arrays command-line command-line-interface

我正在尝试制作一个自定义命令行来控制机器人手臂。 所以我希望能够运行程序并键入servoMove(arg1,arg2)并将arg1和arg2转换为函数servoMove。我相信这就是你所谓的命令行界面。

servoPos = [0,1,2,3,4]

def servoMove(servo,angle):
    servoPos[servo] = angle
    print(servoPos[servo])

def commands(cmd):
    if cmd == 'servoMove('+arg1+','+arg2+')':
        servoMove(arg1,arg2)
    else:
        print("[Error] - Unknown Command")

commands(input(""))

显然,下面的代码对此不起作用。

    if cmd == 'servoMove('+arg1+','+arg2+')':
        servoMove(arg1,arg2)

有人知道我该怎么做吗?

3 个答案:

答案 0 :(得分:1)

您可以使用正则表达式来解析命令。

import re
def commands(cmd):
    m = re.match(r'servoMove\((\d+),(\d+)\)', cmd)
    if m:
        servoMove(int(m.group(1)), int(m.group(2)))
        return
    # Put similar tests for other commands here
    # ...
    print("[Error] - Unknown Command")

这是一种非常粗暴的方式 - 如果用户没有完全正确地输入命令,它会抱怨命令未知。如果你想要更强大的东西,你需要学习如何编写一个真正的解析器。或者使用更好的用户界面,例如Tkinter来实现用户可以填写的表单。

答案 1 :(得分:0)

只是在if语句中查看问题所在的结构:arg1和arg2在该阶段是未定义的,所以你会得到一个False。对于初学者,你想要用以下内容替换它:

#Look at the nine first characters to see if they match your function
if cmd[:9] == 'servoMove':

要提取你的参数,我会在here.中使用一些字符串操作。我将输入切片为“(”和“,”作为arg1和“,”和“)之间的文本“如arg2。

arg1 = cmd[cmd.find("(")+1:cmd.find(",")]
arg2 = cmd[cmd.find(",")+1:cmd.find(")")]

把它放在一起:

def commands(cmd):
    if cmd[:9] == 'servoMove':
        arg1 = cmd[cmd.find("(")+1:cmd.find(",")]
        arg2 = cmd[cmd.find(",")+1:cmd.find(")")]
        servoMove(arg1, arg2)
    else:
        print("[Error] - Unknown Command")

答案 2 :(得分:0)

您可以使用cmd module构建命令行界面。

以下是一个例子:

import cmd

servoPos = [0,1,2,3,4]

def servoMove(servo,angle):
    servoPos[servo] = angle
    print(servoPos[servo])

class ServoShell(cmd.Cmd):
    prompt = '=> '

    def do_servoMove(self, arg):
        'Edit this to give a description to the function when typing ?'
        servoMove(*parse(arg))

def parse(arg):
    'Convert a comma separated string into a tuple'
    return tuple(map(int, arg.strip('()').split(',')))

if __name__ == '__main__':
    ServoShell().cmdloop()