list_string = list(string)
underscore = "_"
indexes_with_upper_symbol = [k for k, v in enumerate(string) if v.isupper()]
for count, index in enumerate(indexes_with_upper_symbol):
if index == 0:
string = string.replace(first_element, first_element.lower(), 1)
elif string[index - 1] == underscore:
continue
else:
list_string.insert(index + count, underscore)
return ''.join(list_string).lower()
string = "enforcesSecureChat"
print(camel_case_to_snake(string))
>>> enforces_secure_chat
Как этот прикол можно улучшить? (И в плане оптимизации, и в плане чистоты кода и всякое такое, вероятно, тут много лишнего)
попробуй этой функции скормить пустую строку...
Хотя одно уже сам скажу: можно избавиться от переменной list_string и конкатенацией там делать
>>> def camel_case_to_snake(x): ... head, *tail = x.split('_') ... return head.lower() + ''.join(map(str.title, tail)) ... >>> camel_case_to_snake('fuck_this_shit') 'fuckThisShit' >>>
Это же получается уже snake_case_to_camel
Я б регексом бомбанул, наверное...
Регексы круто конечно, но я стараюсь избегать их (тут, соглашусь, пофиг вще, но раз уже есть такое, то почему бы и да)
Зачем избегать инструмент как раз там, где он удобен?
In [107]: camel_case_to_snake('HTTPServer') Out[107]: 'ht_t__tt___ttpserver'
желательно чтобы оно сначала вообще работало
Вообще, насколько тебе интересны не-ASCII символы?
Не интересны
regex.sub(r'([[:upper:]])', lambda x: f"_{x.group(0).lower()}", 'HTTPServer').strip('_') Если без учёта юникодовских символов, заменить regex на re и [:upper:] на A-Z. Ну и концептуально не решён вопрос с аббривеатурами.
а _б_б_р_е_в_и_а_т_у_р_ы зло!
ну достаточно имхо простого правила "каждая заглавная стартует новую группу"
Кривота получится. Как с http.
Мне казалось, что в питоне [[:upper:]] не работает
Обрати внимание на regex вместо re.
Обсуждают сегодня