【问题标题】:How would I convert user input into function arguments?如何将用户输入转换为函数参数?
【发布时间】:2018-06-04 16:50:00
【问题描述】:

我正在尝试制作一个自定义命令行来控制机械臂。 所以我希望能够运行程序并输入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)

有人知道我该怎么做吗?

【问题讨论】:

  • 我猜命令行界面是简要的某种要求,否则你为什么不直接运行模块,然后在shell提示符下输入“servoMove(etc”?跨度>
  • "servoMove('+arg1+','+arg2+')"

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


【解决方案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 来实现用户可以填写的表单。

【讨论】:

    【解决方案2】:

    您可以使用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()
    

    【讨论】:

      【解决方案3】:

      只看结构,问题出在 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")
      

      【讨论】:

      • 如果你这样做,使用.startswith() 解析命令可能更容易。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-24
      相关资源
      最近更新 更多