Uçuş analizi: develeri doğru şekilde nasıl öldürürsünüz 🐪

Evrensel bir dizeyi snake_case'e dönüştürme bağlamında, regex ile bu yaklaşım muhtemelen en iyi seçenektir:

import re

def to_snake_case(s: str) -> str:
s = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', s)
return re.sub('([a-z0-9])([A-Z])', r'\1_\2', s).replace('-', '_').lower()


🧐 Nasıl çalışır?

1️⃣ re.sub('(.)([A-Z][a-z]+)', r'\1_\2', s) küçük harften önce gelen her büyük harfi, önüne alt çizgi ekleyerek aynı harfle değiştirir.

2️⃣ re.sub('([a-z0-9])([A-Z])', r'\1_\2', s) küçük harf veya rakamdan önce gelen her büyük harfi, önüne alt çizgi ekleyerek aynı harfle değiştirir.

3️⃣ Ardından her şey küçük harfe dönüştürülür ve tire alt çizgi ile değiştirilir.

Ama algoritma sorusunun ötesine geçip gerçek hayatta böyle bir sorunun nasıl çözüleceğine bakalım. Projede Pydantic kullanılıyorsa, tüm bunlar zaten yazılmış, milyonlarca satır kod üzerinde test edilmiş ve kutudan çıkar:

from pydantic import BaseModel, ConfigDict
from pydantic.alias_generators import to_camel, to_snake

class FrontendData(BaseModel):
model_config = ConfigDict(
alias_generator=to_camel, # Otomatik olarak girişte camelCase bekler
populate_by_name=True
)

python_talk: str # Kodda ortodoks snake_case ile çalışırız

Perde arkasında, uç durumları, standart olmayan ayırıcıları ve komşu sistem geliştiricilerinin hasta hayal güçlerini hesaba katan cilalanmış algoritmalar vardır.

Pydantic projede yoksa, aynı işi yapan inflection gibi mikro kütüphaneler vardır:
import inflection

inflection.underscore("CamelCaseAnd-kebab-case")
# -> 'camel_case_and_kebab_case'

inflection.camelize("python_talk", uppercase_first_letter=False)
# -> 'pythonTalk'


Regex algoritmalarını bilmek, algoritma mülakatını geçmek ve dizelerin nasıl ayrıştırıldığını anlamak için faydalıdır. Ancak araçları bilmek, ilk bozuk payload'da kaçınılmaz olarak kırılacak kendi tekerleklerinizi üretime taşımamak için gereklidir.

#algoritma_mülakatı