лучший формат, чем использование try и кроме

В настоящее время я делаю программу, которая позволяет мне искать файлы в указанном пользователем каталоге. Но у меня возникли проблемы с сокращением моих утверждений try и except. Мой текущий код выглядит следующим образом:

if os.path.exists(file_path)!= True:
        print('\n******* Path does not exist. *******\n')       

    else:
        while True:
            aa = '''\nWhich search characteristics would you like to use? \n 1. Search by name: N \n 2. Search by extension: E \n 3. Search by size: S
                \n    Please enter your choice: '''

            answer = input(aa).strip()

            if answer not in 'NnEeSs' or answer=='':
                print('\n***** Invalid choice. *****')

            elif answer in 'Nn':
                while True:
                    try:
                        name = input ('\nEnter file name: ')
                        rr = search_by_name(name, file_path)
                        if not rr:
                            print('\n***** File not found *****\n')
                        else:
                            break

                    except WindowsError:
                        print('\n***** Oops! Access denied.*****\n')
                        continue


            elif answer in 'Ee':
                while True:
                    try:
                        ending = input ('\nEnter the file extension: ')
                        rr = search_by_extention(ending, file_path)
                        if not rr:
                            print('\n***** No File(s) found *****\n')
                        else:
                            break

                    except WindowsError:
                        print('\n***** Oops! Access denied. *****\n')
                        continue              

            elif answer in 'Ss':
                while True:
                    try:
                        size = int(input('\nPlease enter file size: '))
                        rr = search_by_size(size, file_path)
                        if not rr:
                            print('\n***** No file(s) found *****\n')
                        else:
                            break

                    except ValueError:
                        print('\n***** Enter an numeric value. *****\n')
                        continue

                    except WindowsError:
                        print('\n***** Oops! Access denied. *****\n')
                        continue

В каждом из этих случаев или в целом, есть ли лучший сжатый способ написать приведенный выше код? Каждая из функций поиска возвращает список, содержащий результат выполнения кода.


person user3233949    schedule 17.04.2014    source источник
comment
Принадлежит сайту codereview...   -  person Wooble    schedule 17.04.2014


Ответы (1)


У меня есть пара предложений:

1. Улучшить отступы.

В верхней части вашего файла у вас есть:

if os.path.exists(file_path)!= True:
    print('\n******* Path does not exist. *******\n')       

    else:

Оператор else должен иметь то же значение отступа, что и исходный if.

2. Удалить новые строки

Поскольку вы беспокоитесь о том, чтобы занять место, просто удалите все символы новой строки. Я бы не советовал этого, потому что ваш код может стать запутанным для чтения, но если вы приверженец пространства, вперед. Я могу насчитать 11 новых строк, поэтому, если вы удалите их, вы удалите 15й файл .

3. Будьте пифоном

Если вам небезразличны строки, которые занимает ваш код, постарайтесь быть как можно более питоничным в отношении каждой строки, чтобы в будущем просмотреть или отредактировать ее. Вместо if x in 'Ss':, чтобы проверить, является ли x s или S, просто выполните if x.lower() == 's':

4. Формат try... except

Ваши try... except охватывают большую часть вашего кода. Попробуйте ограничить их только строкой, которая может вызвать ошибку. Вот пример:

try:
    var = int(raw_input())
    x = float(var)/100.0
    if x == 1:
        print 'YAY'
    else:
        print 'BOO!'
    for k in range(1, x):
        print 'this has looped %d times' %(k)
except ValueError:
    print 'Your input is not in a number format!'

В этом коде мы хотим убедиться, что ввод является числом. Однако это можно проверить только по первой строке, а все остальное — чушь. Так что просто окружите первую строку и оставьте остальные нетронутыми.

Примечание:

Не удаляйте необходимые компоненты из ваших try... except, иначе может возникнуть произвольная ошибка.

5. Сократите while петель

Вместо выполнения следующего кода:

while True:
    try:
        size = int(input('\nPlease enter file size: '))
        rr = search_by_size(size, file_path)
        if not rr:
            print('\n***** No file(s) found *****\n')
        else:
            break

    except ValueError:
        print('\n***** Enter an numeric value. *****\n')
        continue

Ты можешь сделать

size = input('\nPlease enter file size: ')
while size.isdigit() == False or not rr = search_by_size(size, file_path):
    size = input('\nPlease enter file size: ')

Ваш отредактированный код: Исходный: 59 строк; Отредактировано: 33 строки:

if os.path.exists(file_path)!= True:
    print('\n******* Path does not exist. *******\n')
else:
    while True:
        aa = '''\nWhich search characteristics would you like to use? \n 1. Search by name: N \n 2. Search by extension: E \n 3. Search by size: S
            \n    Please enter your choice: '''
        answer = input(aa).strip()
        if answer not in 'NnEeSs' or answer=='':
            print('\n***** Invalid choice. *****')
        elif answer.lower() == 'n':
            name = input ('\nEnter file name: ')
            try:
                while not search_by_name(name, file_path):
                    name = input ('\nEnter file name: ')
            except WindowsError:
                print('\n***** Oops! Access denied.*****\n')
                continue
        elif answer .lower() == 'e':
            ending = input ('\nEnter the file extension: ')
            try:
                while not search_by_extention(ending, file_path):
                    ending = input ('\nEnter the file extension: ')
            except WindowsError:
                print('\n***** Oops! Access denied. *****\n')
                continue
        elif answer.lower() == 's':
            size = input('\nPlease enter file size: ')
            try:
                while size.isdigit() == False or not search_by_size(size, file_path):
                    size = input('\nPlease enter file size: ')
            except WindowsError:
                print('\n***** Oops! Access denied. *****\n')
                continue
person A.J. Uppal    schedule 17.04.2014