Understregningen _ er speciel i Python. Mens understregningen bruges til bare slangeformede variabler og funktioner i mange sprog, men den har særlige betydninger i Python. De bruges i vid udstrækning i forskellige scenarier, herunder tilfælde, hvor vi gerne vil ignorere en værdi, eller i deklaration af variabler, metoder osv.

Enkle og dobbelte understregninger har en betydning i Python-variabel- og metodebetegnelser. Noget af betydningen er blot en konvention, mens noget af den er håndhævet af Python-fortolkeren.

I denne artikel vil vi diskutere de fem understregningsmønstre og navngivningskonventioner, og hvordan de påvirker opførslen af vores Python-programmer. Forståelse af disse begreber vil hjælpe meget, især når vi skriver avanceret kode.

I slutningen af dette indlæg vil vi have en rimelig forståelse af, hvordan og hvor vi skal bruge hvilket understregningsmønster i vores navngivningskonvention. Så lad os komme i gang.

Single Leading Underscore (enkelt ledende understregning):

Understregspræfikset er ment som et hint til en anden programmør om, at en variabel eller metode, der begynder med en enkelt understregning, er beregnet til intern brug. Denne konvention er defineret i PEP 8.

Et navn med en understregning som præfiks (f.eks. _spam) skal behandles som en ikke-offentlig del af API’et (uanset om det er en funktion, en metode eller et datamedlem). Det bør betragtes som en implementeringsdetalje og kan ændres uden varsel.

Se på følgende eksempel:

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

Lad os instantiere ovenstående klasse og forsøge at få adgang til name og _age-attributterne.

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

Så enkelt understregningspræfiks i Python er blot en aftalt konvention og pålægger ikke nogen begrænsninger for adgangen til værdien af den pågældende variabel.

Dobbelt ledende understregning: __var

Brugen af dobbelt understregning (__) foran et navn (specifikt et metode-navn) er ikke en konvention; det har en specifik betydning for fortolkeren.

Python mangler disse navne, og det bruges for at undgå navnekollisioner med navne defineret af underklasser.

Dette kaldes også name mangling – fortolkeren ændrer navnet på variablen på en måde, der gør det sværere at skabe kollisioner, når klassen senere udvides.

For at forstå bedre, opretter vi vores legetøjsklasse til eksperimentering:

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

Lad os tage et kig på attributterne på dens objekt ved hjælp af den indbyggede dir()-funktion:

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

Fra ovenstående liste over objektets attributter kan vi se, at self.name og self._age fremstår uændret og opfører sig på samme måde.

Derimod er __id manglet til _Person__id. Dette er den navnemangling, som Python-fortolkeren anvender. Det gør den for at beskytte variablen mod at blive overstyret i underklasser.

Nu, hvis vi opretter en underklasse af Person, f.eks. Employee, kan vi ikke let overstyre Persons __id-variabel.

Den tilsigtede adfærd her svarer næsten til endelige variabler i Java og ikke virtuelle i C++.

Single trailing Underscore: var_

Som forklaret i PEP 8-dokumentationen:

Navnekonventionen for single trailing underscore bruges for at undgå konflikter med Python-nøgleord.

Når det mest passende navn for en variabel allerede er taget af et nøgleord, følges konventionen for tilføjelse af en single underscore for at bryde navnekonflikten. Typisk eksempel omfatter brug af class eller andre nøgleord som variabler.

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

Dobbelt ledende og afsluttende understregning: __var__

Navne, der har ledende og afsluttende dobbelte understregninger (“dunders”), er reserveret til særlig brug som__init__-metoden til objektkonstruktører eller __call__-metoden til at gøre objektet opkaldbart. Disse metoder er kendt som dundermetoder.

For så vidt angår en selv, er dette blot en konvention, en måde for Python-systemet at bruge navne på, som ikke vil være i konflikt med brugerdefinerede navne. Derfor er dundere blot en konvention og bliver ikke berørt af Python-fortolkeren.

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

Dundere opnår det ønskede mål, nemlig at gøre visse metoder specielle og samtidig gøre dem helt ens med andre almindelige metoder i alle aspekter undtagen navnekonvention.

For at være ærlig er der intet, der forhindrer os i at skrive vores egne dundernavne, men det er bedst at holde sig fra at bruge dem i vores programmer for at undgå kollisioner med fremtidige ændringer i Python-sproget. (Se min denne historie, der beskriver dundere udførligt).

Single Underscore:

Per konvention bruges en enkeltstående understregning nogle gange som navn for at angive, at en variabel er midlertidig eller ubetydelig.

For eksempel har vi i følgende løkke ikke brug for adgang til det løbende indeks, og vi kan bruge “_” for at angive, at det blot er en midlertidig værdi:

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

Også denne betydning er kun “per konvention”, og der udløses ingen særlig adfærd i Python-fortolkeren. Den enkelte understregning er blot et gyldigt variabelnavn, der nogle gange bruges til dette formål.

Konklusioner:

Kendskab til de forskellige understregningsmønstre vil hjælpe os med at skrive vores kode mere pythonisk. 😄

Her er en hurtig oversigt over vores 5 understregningsmønstre til navngivningskonventioner, som vi har dækket ovenfor.

  • Single Leading Underscore _var: Navngivningskonvention, der angiver, at navnet er beregnet til intern brug. Et hint til programmører og ikke håndhævet af programmører.
  • Double Leading Underscore __var: Udløser navnemangling, når den bruges i klassesammenhæng. Håndhæves af Python-fortolkeren.
  • Single Trailing Underscore var_: Bruges som konvention for at undgå navnekonflikter med Python-keywords.
  • Double Trailing Underscore __var__: Angiver særlige metoder defineret af Python-sproget.
  • Understregning _: Bruges som navn for midlertidige variabler.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.