2016-02-17 2 views
0

Я работаю над скриптом для автоматизированного рабочего процесса. Он ожидает, что CSV и образ диска будут присутствовать в каталоге, который поставляется как args.input.Как сделать эту функцию более эффективной для питона?

Я хочу проверить и обработать все возможные сценарии: нет CSV, никакого образа диска, слишком много CSV, слишком много образов дисков и любая возможная комбинация с ними.

Я написал нижеследующее, которое работает и кажется читаемым человеком, но это кажется невероятно чрезмерным и многословным - есть ли способ сделать это более компактным, но все же сохранить его удобочитаемость?

# CONFORMANCE CHECKS 
def check_conformance(): 
    csv = glob.glob(args.input+'*.csv') 
    disk_image = glob.glob(args.input+'*.E01') 

    if len(csv) == 1: 
     does_csv_exist = os.path.isfile(csv[0]) 
    elif len(csv) < 1: 
     does_csv_exist = False 
    elif len(csv) > 1: 
     does_csv_exist = "too many CSVs!" 
    if len(disk_image) == 1: 
     does_E01_exist = os.path.isfile(disk_image[0]) 
    elif len(disk_image) < 1: 
     does_E01_exist = False 
    elif len(disk_image) > 1: 
     does_E01_exist = "too many Disk Images!" 
    if len(disk_image) > 1 and len(csv) > 1: 
     does_csv_exist = "too many CSVs!" 
     does_E01_exist = "too many disk images!" 
     return (False, does_csv_exist, does_E01_exist,) 
    if does_E01_exist is True and does_csv_exist is True: 
     return True 
    elif does_E01_exist is True and does_csv_exist is False: 
     return (False, "CSV is missing") 
    elif does_E01_exist is False and does_csv_exist is True: 
     return (False, "E01 disk image is missing") 
    elif does_E01_exist is False and does_csv_exist is False: 
     return (False, "E01 disk image AND csv are missing") 
    elif does_csv_exist is not True and does_csv_exist is not False: 
     return (False, does_csv_exist) 
    elif does_E01_exist is not True and does_E01_exist is not False: 
     return (False, does_E01_exist) 
+1

Этот вопрос может быть лучше подходит для [codereview.se]. Однако, конечно, это не похоже на Pythonic. – jonrsharpe

+0

Не знал об этом SE - отлично. Будет опубликован там. – dongle

+0

[Перекрестная ссылка] (http://codereview.stackexchange.com/q/120350/9357) по обзору кода. –

ответ

1

Я не знаю точно, какова цель этой функции, но вот несколько советов:

  • Функция должна иметь только одну функцию. Кажется, у вас многократный возврат, соответствует ли вход ваших стандартов (True/False) и возвращает какую-то строку ошибки (str). Вы возвращаете кортежи, которые сочетают эти две вещи непредсказуемым образом. Либо выбрать один или другой, или стандартизировать кортеж и всегда возвращают то же самое точное одно (т.е. (bool, str))

  • Даже если вы можете установить несколько различных типов в одной и той же переменной, вы не должны. Не установлено логическое значение в одном состоянии, а затем строку в другое состояние (см does_csv_exist)

я сделал бы что-то вроде этого:

# CONFORMANCE CHECKS 
# Returns a list of error strings encountered, empty list if OK 
def getConformanceErrors(): 
    csv = glob.glob(args.input+'*.csv') 
    disk_image = glob.glob(args.input+'*.E01') 

    msg = [] 

    if len(csv) < 1: 
     msg.append("CSV is missing") 
    elif len(csv) > 1: 
     msg.append("Too many CSVs") 

    if len(disk_image) < 1: 
     msg.append("Disk Image is missing") 
    elif len(disk_image) > 1: 
     msg.append("Too many Disk Images") 

    return msg