我正在制作一个脚本,为用户提供了许多可供选择的选项,例如
选择功能选项
(如果选择A)选择A子功能
(如果选择了B)选择B子功能
依旧......
每个选项都可供选择选项,并根据选择,python程序将继续。请注意,在每个选项之前,我提供print
print ''' Enter Directory
1. Current Working Directory
2. CHoose other folder'''
然后我使用raw_input
来接受用户输入,这在这种情况下基本上意味着对用户的大量提示(以及杂乱的代码)。我怀疑这可能不是最好的设计。
我的问题是我正确地做了还是有其他方法我错过了?
答案 0 :(得分:2)
一种方法是在用户运行函数时提供命令行输入(argv)。如果elif情况下代码可以根据用户输入执行特定的块。
例如下面的内容:
类似的东西 - 如果用户以' example.py argv [1]'运行程序,argv [1]可以是内部函数名,如A,B ......
if sys.argv[1] == 'A':
function_name = raw_input("enter A1/A2/A3":)
func(function_name)
elif sys.argv[1] == 'B':
function_name = raw_input("enter B1/B2/B3":)
func(function_name)
else:
print >> sys.stderr,'usage:example.py A|B|...'
答案 1 :(得分:0)
您可以创建一个字典,其中键是用户可能的输入,值是指向下一个可用字典的指针。使原始输入成为循环内调用的函数。在适当的位置退出循环。
答案 2 :(得分:0)
您可以为选项/选项的每个“级别”保留一个字典,其中函数作为值,用户输入作为键:
primary = {'A':opt_a, 'B':opt_b, 'C':opt_c, 'D':opt_d}
secondary = {'A1':opt_a1, 'B':opt_b1, 'C1':opt_c1, 'D1':opt_d1}
opt = raw_input("Choose - A, B, C, D - ")
opt_func = primary.get(opt)
if not opt_func:
print "Invalid Option"
else:
opt_func()
def opt_a():
opt = raw_input("Choose - A1, A2, A3, A4 - ")
opt_func = secondary.get(opt)
if not opt_func:
return "Invalid Option"
opt_func()
def opt_b()...
然后对每个选项想要做的许多层执行相同的操作。
答案 3 :(得分:0)
一个选项(ha!)是将选项的结构存储在变量中。
例如,(在您的脑海中)将“菜单”定义为包含这些值的某些子集的dict:
上面给出的例子
def function_for_A1():
print "You chose A1!"
menus={"question":"Choose function Options","answers":[
{"description":"A","question":"Choose A Subfunctions","answers":[
{"description":"A1","code":function_for_A1},
{"description":"A2","code":function_for_A2},
]},
{"description":"B","question":"Choose B Subfunctions","answers":[
{"description":"B1","code":function_for_A1},
{"description":"B2","question":"B2 sub-suboption","answers":[...]},
]},
}
一旦你有这个结构,给定当前菜单,显示它是相当容易的 - 运行代码(如果它存在),否则显示问题,并为每个答案显示一个数字和“描述”。一旦他们选择了一个号码,找到菜单,洗,rince,重复。你可以使菜单函数递归,所以如果他们选择“0 - back”,那么你从当前函数返回。
完成!