Varierade användningsområden för understreck i namnkonventioner förklaras!!

Rachit Tayal

Follow

6 augusti, 2019 – 5 min read

Understrykningen _ är speciell i Python. Även om understrykningen används för bara variabler och funktioner med ormbeteckning i många språk, har den särskilda betydelser i Python. De används flitigt i olika scenarier, bland annat i fall där vi vill ignorera något värde, eller i deklaration av variabler, metoder etc.

Enkla och dubbla understrykningar har en innebörd i Pythons variabel- och metodnamn. En del av innebörden är bara en konvention medan en del av innebörden är påtvingad av Python-tolken.

I den här artikeln kommer vi att diskutera de fem understrykningsmönstren och namnkonventionerna och hur de påverkar beteendet i våra Python-program. Att förstå dessa begrepp kommer att vara till stor hjälp, särskilt när vi skriver avancerad kod.

I slutet av det här inlägget kommer vi att ha en rättvis förståelse för hur och var vi ska använda vilket mönster av underscore i vår namnkonvention. Så låt oss börja.

Single Leading Underscore: _var

Understrykningsprefixet är tänkt som en ledtråd till en annan programmerare om att en variabel eller metod som börjar med en enkel understrykning är avsedd för internt bruk. Denna konvention definieras i PEP 8.

Ett namn som föregås av ett understreck (t.ex. _spam) ska behandlas som en icke-offentlig del av API:et (oavsett om det är en funktion, en metod eller en datamedlem). Det bör betraktas som en implementationsdetalj och kan ändras utan förvarning.

Ta en titt på följande exempel:

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

Låt oss instansiera ovanstående klass och försöka få tillgång till attributen name och _age.

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

Så, enkel understrykningsprefix i Python är bara en överenskommen konvention och innebär inga begränsningar för åtkomst till värdet av den variabeln.

Double Leading Underscore (dubbel ledande understrykning): <_var>

Användningen av dubbel understrykning (__) framför ett namn (särskilt ett metodnamn) är inte en konvention, utan har en specifik betydelse för tolken.

Python manglar dessa namn och det används för att undvika namnkollisioner med namn som definieras av underklasser.

Detta kallas också för namnmangling – tolken ändrar variabelns namn på ett sätt som gör det svårare att skapa kollisioner när klassen senare utökas.

För att förstå bättre skapar vi vår leksaksklass för att experimentera:

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

Låt oss ta en titt på attributen på dess objekt med hjälp av den inbyggda dir()-funktionen:

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

Från ovanstående lista över objektets attribut kan vi se att self.name och self._age verkar oförändrade och beter sig på samma sätt.

Däremot manglas __id till _Person__id. Detta är den namnmangling som Python-tolken tillämpar. Den gör detta för att skydda variabeln från att överordnas i underklasser.

Om vi nu skapar en underklass till Person, säg Employee, kan vi inte enkelt överordna Persons __id-variabel.

Det tänkta beteendet här är nästan likvärdigt med finalvariabler i Java och non virtual i C++.

Single Trailing Underscore: var_

Som förklaras i PEP 8-dokumentationen:

Namngivningskonventionen för single trailing underscore används för att undvika konflikter med Python-nyckelord.

När det lämpligaste namnet för en variabel redan har tagits upp av ett nyckelord, följs konventionen för att lägga till en singel underscore för att bryta namngivningskonflikten. Ett typiskt exempel är att använda class eller andra nyckelord som variabler.

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

Double Leading and Trailing Underscore: Namn som har ledande och avslutande dubbla understrykningar (”dunders”) är reserverade för specialanvändning som __init__-metoden för objektkonstruktörer eller __call__-metoden för att göra ett objekt anropsbart. Dessa metoder kallas dundermetoder.

För egen del är detta bara en konvention, ett sätt för Pythonsystemet att använda namn som inte kommer i konflikt med användardefinierade namn. Därför är dunders bara en konvention och lämnas orörda av Python-tolken.

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

Dunders uppnår det önskade målet att göra vissa metoder speciella samtidigt som de är precis likadana som andra vanliga metoder i alla avseenden utom i fråga om namnkonvention.

För att vara ärlig finns det inget som hindrar oss från att skriva egna dundernamn, men det är bäst att hålla sig borta från att använda dem i våra program för att undvika kollisioner med framtida ändringar av Pythonspråket. (Se min denna berättelse som beskriver dunder utförligt).

Single Underscore:

På konvention används ibland ett enda fristående understreck som namn för att ange att en variabel är tillfällig eller obetydlig.

I följande slinga behöver vi till exempel inte tillgång till det löpande indexet och vi kan använda ”_” för att ange att det bara är ett temporärt värde:

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

Den här innebörden är bara ”på konvention” och det finns inget speciellt beteende som utlöses i Python-tolken. Den enkla understrykningen är helt enkelt ett giltigt variabelnamn som ibland används för detta ändamål.

Slutsatser:

Kännedom om de olika understrykningsmönstren kommer att hjälpa oss att skriva vår kod mer pythoniskt. 😄

Här är en snabb sammanfattning av våra 5 understrykningsmönster för namngivningskonventioner, som vi har behandlat ovan.

  • Single Leading Underscore _var: Namngivningskonvention som indikerar att namnet är avsett för internt bruk. Ett tips för programmerare som inte tillämpas av programmerare.
  • Double Leading Underscore __var: Utlöser namnförvanskning när det används i klassammanhang. Påtvingas av Python-tolken.
  • Single Trailing Underscore var_:
  • Double Trailing Underscore __var__: Anger särskilda metoder som definieras av Python-språket.
  • Underscore _: Anger särskilda metoder som definieras av Python-språket.
  • Underscore _: Anger särskilda metoder som definieras av Python-språket: Används som namn för tillfälliga variabler.

Lämna ett svar

Din e-postadress kommer inte publiceras.