Sry for the unclear formatting, this is the original code with correct
format (copy from pycharm),

print('insert data into: ')
data_insert_method = ['new collection', 'existing collection']
for index, elem in enumerate(data_insert_method):
    print(index, '-', elem)

while 1:
    how_to_insert = input('Choose a method for inserting data: ')
    if how_to_insert:
        try:
            how_to_insert = int(how_to_insert)
            how_to_insert = data_insert_method[how_to_insert]
            break
        except ValueError:
            print('Please type in an integer corresponding to the data
insert method')
            continue
        except IndexError:
            print('insert method index out of range')
            continue

if how_to_insert == 'new collection':

    print('Set up collection name : ')
    db_name_setup = ['manual setup', 'return to main menu']
    for index, elem in enumerate(db_name_setup):
        print(index, '-', elem)

    while 1:
        how_to_setup = input('Choose a method for setting up collection: ')
        if how_to_setup:
            try:
                how_to_setup = int(how_to_setup)
                how_to_setup = db_name_setup[how_to_setup]
                break
            except ValueError:
                print('Please type in an integer corresponding to the
collection setup method')
                continue
            except IndexError:
                print('db name setup method index out of range')
                continue

    if how_to_setup == 'manual setup':
        print('Please type in collection name ')
    elif how_to_setup == 'return to main menu':
        print('return to main menu')



On 24 September 2017 at 22:11, Cameron Simpson <c...@cskk.id.au> wrote:

> On 24Sep2017 21:41, Daiyue Weng <daiyuew...@gmail.com> wrote:
>
>> Hi, I tried to make a menu using print statements in Python 3. The code is
>> as follows,
>>
>
> One thing, please try to preserve the code indenting in messages. What you
> pasted is all hard against the left side of the screen. I've tried to
> repair it.
>
> print('insert data into: ')
>> data_insert_method = ['new collection', 'existing collection']
>> for index, elem in enumerate(data_insert_method):
>>  print(index, '-', elem)
>>
>> while 1:
>>
>
> Remark: we tend to say "while True:", it reads more naturally.
>
> how_to_insert = input('Choose a method for inserting data: ')
>> if how_to_insert:
>>  try:
>>    how_to_insert = int(how_to_insert)
>>    how_to_insert = data_insert_method[how_to_insert]
>>    break
>>  except ValueError:
>>    print('Please type in an integer corresponding to the data insert
>> method')
>>    continue
>>  except IndexError:
>>    print('insert method index out of range')
>>    continue
>>
>
> Another remark: it is better to keep try/except around as small a piece of
> code as possible; I'd use two here, one for ValueError around the int() and
> one for IndexError around the [].
>
>
>  if how_to_insert == 'new collection':
>>    print('Set up collection name : ')
>>    db_name_setup = ['manual setup', 'return to the main menu']
>>    for index, elem in enumerate(db_name_setup):
>>      print(index, '-', elem)
>>    while 1:
>>      how_to_setup = input('Choose a method for setting up collection: ')
>>      if how_to_setup:
>>        try:
>>          how_to_setup = int(how_to_setup)
>>          how_to_setup = db_name_setup[how_to_setup]
>>          break
>>        except ValueError:
>>          print('Please type in an integer corresponding to the collection
>> setup method')
>>          continue
>>        except IndexError:
>>          print('collection setup method index out of range')
>>          continue
>>        if how_to_setup == 'manual setup':
>>          print('Please type in collection name: ')
>>        elif how_to_setup == 'return to main menu':
>>          print('return to main menu')
>>
>> It is a 2-level menu, on the 2nd level menu 'new collection', there is an
>> option - 'return to the main menu', I am wondering how to loop back to the
>> 1st level menu, i.e. ['new collection', 'existing collection'],
>> whenever 'return to the main menu' is selected.
>>
>
> This is where the lack of indentation in your posted code bites; I've just
> realised I've misread your logic because I misindented your code :-( Your
> "while 1:" is just a loop around the input question, not around the menu
> choices.
>
> I would go with a flag, and use it as your loop condition. Like this:
>
>  running_inner_menu = True
>  while running_inner_menu:
>
> So something like this (untested):
>
>  if how_to_insert == 'new collection':
>    running_inner_menu = True
>    while running_inner_menu:
>      print('Set up collection name : ')
>      db_name_setup = ['manual setup', 'return to the main menu']
>      for index, elem in enumerate(db_name_setup):
>        print(index, '-', elem)
>      # obtain a valid choice
>      while 1:
>        how_to_setup = input('Choose a method for setting up collection: ')
>        if how_to_setup:
>          try:
>            how_to_setup = int(how_to_setup)
>            how_to_setup = db_name_setup[how_to_setup]
>            break
>          except ValueError:
>            print('Please type in an integer corresponding to the
> collection            setup thod')
>            continue
>          except IndexError:
>            print('collection setup method index out of range')
>            continue
>      if how_to_setup == 'manual setup':
>        print('Please type in collection name: ')
>        ... etc ...
>      elif how_to_setup == 'return to main menu':
>        print('return to main menu')
>        running_inner_menu = False
>
> All this depends a little on how your code was originally indented i.e.
> exactly which portions of the code were within each while loop. I've
> guessed at something reasonable, but can see that there's room for
> different arrangements.
>
> But basicly, keep a state variable indicating that a loop should continue.
> As a piece of terminology, a Boolean (True/False) state variable is often
> called a flag.
>
> This has two advantages:
>
> It means you can turn it off anywhere and next time around the loop will
> stop, whereas doing things directly with continue or break requires
> "structural" control because they only jump out of the innermost loop, and
> also they act right now, preventing other relevant stuff being done.
>
> Also it makes your code more readable and easier to reason able: a loop
> which says "while running_inner_menu:" directly says that this loop
> controls a repeating menu, and that you can get out by changing
> "running_inner_menu". A bare "while 1:" or "while True:" requires the
> reader to have to scan the code to figure out what is being controlled.
>
> Cheers,
> Cameron Simpson <c...@cskk.id.au> (formerly c...@zip.com.au)
>
-- 
https://mail.python.org/mailman/listinfo/python-list

Reply via email to