Podtržítko _ je v Pythonu zvláštní. Podtržítko se sice v mnoha jazycích používá jen pro proměnné a funkce psané hadím písmem, ale v Pythonu má zvláštní význam. Hojně se používá v různých scénářích včetně případů, kdy bychom chtěli ignorovat nějakou hodnotu, nebo v deklaraci proměnných, metod apod.

Jedno a dvojité podtržítko má v Pythonu význam v názvech proměnných a metod. Některé z těchto významů jsou dány pouze konvencí, zatímco některé jsou vynuceny interpretem jazyka Python.

V tomto článku probereme pět vzorů podtržítek a konvencí pro jejich pojmenování a jejich vliv na chování našich programů v jazyce Python. Pochopení těchto pojmů nám velmi pomůže zejména při psaní pokročilého kódu.

Na konci tohoto příspěvku budeme mít dostatečnou představu o tom, jak a kde použít který vzor podtržítka v naší jmenné konvenci. Pojďme tedy začít.

Jednoznačné vedoucí podtržítko: _var

Předpona podtržítka je určena jako nápověda pro jiného programátora, že proměnná nebo metoda začínající jedním podtržítkem je určena pro interní použití. Tato konvence je definována v PEP 8.

Název s předponou podtržítka (např. _spam) by měl být považován za neveřejnou část API (ať už jde o funkci, metodu nebo datový člen). Měl by být považován za implementační detail a může být změněn bez předchozího upozornění.

Podívejte se na následující příklad:

class Person:
def __init__(self):
self.name = 'Sarah'
self._age = 26

Instancujme výše uvedenou třídu a zkusme přistupovat k atributům name a _age.

>>> p = Person()>>> p.name
Sarah>>> p._age
26

Takže předpona jednoduchého podtržítka v jazyce Python je pouze dohodnutá konvence a neukládá žádná omezení pro přístup k hodnotě této proměnné.

Dvojité vedoucí podtržítko: __var

Použití dvojitého podtržítka (__) před názvem (konkrétně názvem metody) není konvence; pro interpret má specifický význam.

Python tyto názvy zkomoluje a používá je, aby se vyhnul kolizi s názvy definovanými podtřídami.

Tomu se také říká name mangling – interpret změní jméno proměnné tak, aby bylo obtížnější vytvářet kolize při pozdějším rozšíření třídy.

Pro lepší pochopení si pro experimentování vytvoříme naši hračkovou třídu:

class Person:
def __init__(self):
self.name = 'Sarah'
self._age = 26
self.__id = 30

Podíváme se na atributy jejího objektu pomocí vestavěné funkce dir():

>>> p = Person()
>>> dir(p)
>>> p.name
Sarah
>>> p._age
26>>> p.__id
AttributeError: 'Person' object has no attribute '__id'>>> p._Person__id
30

Z výše uvedeného seznamu atributů objektu vidíme, že self.name a self._age se jeví beze změny a chovají se stejně.

Naproti tomu __id je zkomolen na _Person__id. Jedná se o manglování jmen, které aplikuje interpret jazyka Python. Dělá to proto, aby ochránil proměnnou před přepsáním v podtřídách.

Nyní, pokud vytvoříme podtřídu Person, řekněme Employee, nemůžeme snadno přepsat proměnnou __id Person.

Zamýšlené chování je zde téměř ekvivalentní finálním proměnným v Javě a nevirtuálním v C++.

Jednoznačné koncové podtržítko: var_

Jak je vysvětleno v dokumentaci PEP 8:

Konvence pojmenování s jedním koncovým podtržítkem se používá, aby se předešlo konfliktům s klíčovými slovy Pythonu.

Když je nejvhodnější jméno pro proměnnou již obsazeno klíčovým slovem, následuje konvence připojování jednoho podtržítka, aby se konflikt pojmenování přerušil. Typickým příkladem je použití class nebo jiných klíčových slov jako proměnných.

>>> def method(name, class='Classname'): # ❌
SyntaxError: "invalid syntax">>> def method(name, class_='Classname'): # ✅
... pass

Dvojité vedoucí a koncové podtržítko: __var__

Jména s počátečním a koncovým dvojitým podtržítkem („dunders“) jsou vyhrazena pro speciální použití, jako je metoda__init__ pro konstruktory objektů nebo metoda __call__ pro volání objektu. Těmto metodám se říká dundrové metody.

Pokud jde o člověka, je to jen konvence, způsob, jak může systém Python používat názvy, které nebudou v rozporu s názvy definovanými uživatelem. Proto jsou dundery jen konvencí a interpreter jazyka Python se jich nedotýká.

class Person:
def __init__(self):
self.__name__ = 'Sarah'>>> Person().__name__
Sarah

Dundery dosahují kýženého cíle – ozvláštnit určité metody a zároveň je učinit stejnými jako ostatní obyčejné metody ve všech ohledech kromě konvence pojmenování.

Pravdu řečeno, nic nám nebrání napsat si vlastní dunderové jméno, ale je lepší nepoužívat je ve svých programech, abychom se vyhnuli kolizím s budoucími změnami jazyka Python. (Viz můj tento článek, který dundery podrobně popisuje).

Jednotlivé podtržítko:

Například v následující smyčce nepotřebujeme přístup k běžícímu indexu a můžeme použít „_„, abychom naznačili, že se jedná pouze o dočasnou hodnotu:

>>> for _ in range(10):
... print('Welcome Sarah!!')

Tento význam je opět pouze „per convention“ a v interpretu jazyka Python není vyvoláno žádné zvláštní chování. Jedno podtržítko je prostě platný název proměnné, který se někdy pro tento účel používá.

Závěry:

Znalost různých vzorů podtržítek pomůže při psaní našeho kódu více pythonovsky. 😄

Tady je stručné shrnutí našich 5 vzorů podtržítek pro pojmenovací konvence, kterými jsme se zabývali výše.

  • Jedno vedoucí podtržítko _var: Pojmenovací konvence označující název určený pro interní použití. Nápověda pro programátory a není programátory vynucována.
  • Double Leading Underscore __var: Vyvolává zkomolení názvu při použití v kontextu třídy. Vynucuje překladač jazyka Python.
  • Jednoduché koncové podtržítko var_:
  • Double Trailing Underscore __var__: Označuje speciální metody definované jazykem Python.
  • Underscore _: Používá se jako název pro dočasné proměnné.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.