logo

Преобразование CamelCase в snake_case в Python: функция

Быстрый ответ

Для конвертации имён, написанных в формате CamelCase, примените следующий код, действующий на основе регулярных выражений (regex):

Python
Скопировать код
import re

def camel_to_snake(name):
    return re.sub(r'(?<!^)(?=[A-Z])', '_', name).lower()

# Пример применения:
print(camel_to_snake('NoMoreCamel'))  # no_more_camel

Здесь метод re.sub() используется для вставки подчёркивания перед каждой заглавной буквой, не являющейся первым символом строки, а затем все символы строки переводятся в нижний регистр с помощью .lower().

Заглянем под капот regex: работа с библиотеками и особые случаи

Преобразование строк с помощью библиотеки inflection

Библиотека inflection прекрасно справляется с преобразованием строк из формата CamelCase в формат snake_case без необходимости вручную писать код:

Python
Скопировать код
import inflection

print(inflection.underscore('CamelCaseAutomagic'))  # camel_case_automagic

Иногда лучше использовать готовые решения, чем тратить время на изобретение велосипеда!

Работа со строками, содержащими ЗАГЛАВНЫЕ буквы и цифры

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

Python
Скопировать код
def camel_to_snake_advanced(name):
    name = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', name)
    return re.sub('([a-z0-9])([A-Z])', r'\1_\2', name).lower()

print(camel_to_snake_advanced('OMGThisIs911'))  # omg_this_is_911

Будем внимательнее: заглавные буквы на горизонте!

Используем библиотеку stringcase для простых конвертаций

Ещё одна очень удобная библиотека, stringcase, позволяет быстро преобразовывать строки из формата CamelCase в snake_case:

Python
Скопировать код
import stringcase

print(stringcase.snakecase('CamelCaseOnSteroids'))  # camel_case_on_steroids

Какой же Python без его понятности и легкости!

Удаление нежелательных подчёркиваний при помощи lstrip

Иногда при преобразовании может появляться лишнее подчёркивание в начале строки. Метод lstrip поможет нам избавиться от него:

Python
Скопировать код
converted = '_pesky_leading_underscore'.lstrip('_')  # 'pesky_leading_underscore'

До свидания, нежелательные подчёркивания!

Python-стиль: соединяем изящную логику и практическую эффективность

Генераторы списков в сочетании с методом join

Посмотрите, как изящно можно использовать генератор списка и метод join для решения нашей задачи:

Python
Скопировать код
def camel_to_snake_pythonic(name):
    return ''.join(['_' + i.lower() if i.isupper() else i for i in name]).lstrip('_')

print(camel_to_snake_pythonic('ThisOneIsFun'))  # this_one_is_fun

Как мудро вина стареют, так со временем улучшаются pythonic-решения! 🍷

Предварительная компиляция regex для увеличения производительности

Когда каждая миллисекунда на счету, предварительно скомпилированные регулярные выражения могут сыграть ключевую роль:

Python
Скопировать код
pattern = re.compile(r'(?<!^)(?=[A-Z])')

def camel_to_snake_precompiled(name, _pattern=pattern):
    return _pattern.sub('_', name).lower()

print(camel_to_snake_precompiled('FastAndFurious'))  # fast_and_furious

С помощью прекомпиляции мы ускоряем наш код до скорости света!

Визуализация

Представьте себе строки как поезда, где каждый вагон – это отдельное слово, написанное по правилам CamelCase:

Markdown
Скопировать код
CamelCaseTrain:
SteamEngine🚂WagonFullOfCamels🚃SnakePassenger🚃LastWagon

А при переводе в snake_case эти вагоны упорядочиваются в спокойную последовательность:

Markdown
Скопировать код
snake_case_train:
🚂steam_engine_wagon_full_of_camels_snake_passenger_last_wagon

Все на борт! Проедемся вместе до остановки snake_case!

Продвинутые техники: акронимы и аббревиатуры

Управление акронимами

Акронимы в строках формата CamelCase могут усложнить процесс преобразования. Возможно, придётся адаптировать существующие методы или использовать специализированные библиотеки:

Python
Скопировать код
print(camel_to_snake_advanced('NASAExplorer'))  # nasa_explorer

Акронимы больше не проблема!

Правильное обращение с аббревиатурами

Аббревиатуры могут создавать особые трудности для процесса конвертации. Чуткость к деталям позволяет изящно обходить эту проблему:

Python
Скопировать код
print(camel_to_snake_advanced('HTTPRequestAPI'))  # http_request_api

Легко, как расшифровка аббревиатуры!

PEP-8: светящийся маяк чистоты и стандартизации Python

Согласно PEP-8, иногда нам требуется вручную проверить код на предмет его читаемости и гармоничности. Автоматизированные методы не всегда идеально следуют стандартам PEP-8.

Полезные материалы

  1. Изящная функция для преобразования CamelCase в snake_case на Python – Stack Overflow – обсуждение разных способов преобразования.
  2. re — Работа с регулярными выражениями — Документация Python 3.12.1 – официальная документация Python, посвященная регулярным выражениям.
  3. Встроенные типы — Документация Python 3.12.1 – раздел документации Python, где описан метод str.join и другие операции со строками.
  4. Inflection — документация inflection 0.4.0 – документация к библиотеке Inflection, позволяющей преобразовывать строки.
  5. GitHub – nficano/humps: Convert strings (and dictionary keys) – библиотека humps, предназначенная для конвертации строк.
  6. PEP 8 – Руководство по стилю кода Python | peps.python.org – стандарты написания кода Python, включая правила наименования.
  7. case_conversion · PyPI – пакет PyPI, ориентированный на переключение между форматами CamelCase и snake_case.