Рубрики
Без рубрики

Избегайте многочисленной ситуации ELIF

Сокращение кода пахнет помощи от первого класса Photo Citizens от Mae Mu на Unsplash … Tagged с Python.

Сокращение кода пахнет помощи от граждан первого класса

фото Мэй Му на Неспособный

Недавно я столкнулся с ситуацией, где Элиф сложены друг на друга, как блины. Например, мы анализируем разные форматы файлов. Наши анализаторы готовы, и нам просто нужен интерфейс более высокого уровня.

if file_format == 'xml':
    parse_xml(file_name)
elif file_format == 'csv':
    parse_csv(file_name)
elif file_format == 'json':
    parse_json(file_name)
else:
    parse_txt(file_name)

Сначала были просто Если и иначе Анкет Затем все начало складываться, и я понял, что несколько Элиф Был просто пахнущий кусок кода.

Чтобы справиться с этим, мы можем использовать концепцию Python, которая функционирует, являются первоклассными гражданами. Это означает, что мы можем вернуть их или использовать их в качестве словарных значений. Таким образом, нам нужно сопоставить наши форматы файлов с соответствующими функциями анализа:

parsers = {
 'xml': parse_xml,
 'csv': parse_csv,
 'json': parse_json,
}

Обратите внимание, что я не включил наш анализатор TXT по умолчанию. Как будто мы переписываем Если и Элиф нашего предыдущего кода. Теперь нам нужна функция, чтобы вернуть анализатор для данного формата файла:

def get_parser(file_format):
    return parsers.get(file_format, parse_txt)

Это вернет функцию анализатора из нашего Парсеры Словарь для данного формата файла. Или, если file_format не является ключом этого словаря, по умолчанию parse_txt Анкет В качестве аналогии раньше, как будто мы переписываем последний иначе утверждение.

Чтобы использовать это, нам нужно позвонить get_parser функция И мы также можем немедленно выполнить это:

get_parser('csv')(file_name)

Но если вы хотите быть более прозрачным, вы можете расширить это до нескольких строк:

parser = get_parser('csv')
parser(file_name)

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

И я хочу верить, что это работает немного быстрее, потому что мы просто получаем ценность от словаря вместо того, чтобы проверять каждое отдельное Если кейс.

Оригинал: “https://dev.to/c_v_ya/reducing-code-smelling-with-a-help-from-first-class-citizens-14ca”