【发布时间】:2015-10-19 22:23:33
【问题描述】:
我一直在试验 Python 套接字服务器等。我遇到了一个想法,但我很难实现它。我希望服务器端能够输入不同的命令,用于启动和停止服务器,以及执行各种其他任务。我的问题是,当我开始有很多命令时,我的程序最终看起来像意大利面条:
if command == "start":
print("Starting server")
time.sleep(1)
listener_thread.start()
elif command == "stop":
print("Stopping server...")
time.sleep(1)
listener_thread.stop()
elif command in ["q", "quit"]:
print("Quitting server...")
time.sleep(1)
for t in connections:
t.stop()
listener_thread.stop()
exit()
else:
print("Invalid command")
我的一个已经编程一段时间的朋友说我应该尝试使用字典来存储每个命令的函数引用。我创建了一个这样的字典:
commands = {
"start": cmd_start, # This would be a reference to cmd_start()
"stop": cmd_stop, # Same here and so forth
"quit": cmd_quit
}
我会这样称呼这些命令:
while True:
command = input("enter a command: ")
if command in commands:
commands[command]()
这种方法的问题是有时我想要一个带有多个参数的命令,有时我不需要。我希望能够使用具有不同参数的不同命令,指定它们所需的参数,并检查以确保该命令是具有所有必需参数的有效命令。我是编程新手,我尝试过想一种干净的方法来实现它。我在谷歌上没有发现任何有用的东西,所以希望有人可以帮助我。谢谢。
【问题讨论】:
-
我认为您对命令映射的想法很好,您要做的就是使每个命令的参数成为参数的变量列表并解析用户的输入。然后调用该命令并将用户输入的所有额外参数传递给它。
-
尝试了解 *args 和 **kwargs 参数。
-
在您的字典中查找输入的第一个单词。然后按照上述 2 建议使用 args、kwargs 并将 words[1:] 传递给命令并让它弄清楚要做什么。我会在 argparse 模块中起草带有参数的命令。
-
查找
click库或argparse模块。 -
这是我想出的:pastebin.com/Kqc5gky4