De underscore _ is bijzonder in Python. Hoewel de underscore in veel talen wordt gebruikt voor variabelen en functies met alleen een hoofdletter, heeft het in Python een speciale betekenis. Ze worden uitgebreid gebruikt in verschillende scenario’s, waaronder gevallen waarin we een waarde willen negeren, of in de declaratie van variabelen, methoden, enz.

Enkele en dubbele underscores hebben een betekenis in Python variabele en methode namen. Een deel van de betekenis is slechts door conventie, terwijl een deel wordt afgedwongen door de Python-interpreter.

In dit artikel zullen we de vijf underscore-patronen en naamgevingsconventies bespreken en hoe ze het gedrag van onze Python-programma’s beïnvloeden. Het begrijpen van deze concepten zal veel helpen, vooral bij het schrijven van geavanceerde code.

Aan het einde van deze post, zullen we een redelijk begrip hebben van hoe en waar welk patroon van underscore te gebruiken in onze naamgevingsconventie. Dus laten we aan de slag gaan.

Single Leading Underscore: _var

De underscore prefix is bedoeld als een hint aan een andere programmeur dat een variabele of methode die begint met een enkele underscore bedoeld is voor intern gebruik. Deze conventie is gedefinieerd in PEP 8.

Een naam voorafgegaan door een underscore (bijv. _spam) moet worden behandeld als een niet-publiek deel van de API (of het nu een functie, een methode of een gegevenslid is). Het moet worden beschouwd als een implementatiedetail en kan zonder kennisgeving worden gewijzigd.

Kijk eens naar het volgende voorbeeld:

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

Laten we de bovenstaande klasse instantiëren en proberen toegang te krijgen tot de name en _age attributen.

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

Dus, enkele underscore prefix in Python is slechts een afgesproken conventie en legt geen beperkingen op voor de toegang tot de waarde van die variabele.

Dubbele Leading Underscore: __var

Het gebruik van dubbele underscore (__) voor een naam (specifiek een methode naam) is geen conventie; het heeft een specifieke betekenis voor de interpreter.

Python mangelt deze namen en het wordt gebruikt om naam botsingen te voorkomen met namen gedefinieerd door subklassen.

Dit wordt ook wel name mangling genoemd – de interpreter verandert de naam van de variabele op een manier die het moeilijker maakt om botsingen te maken wanneer de klasse later wordt uitgebreid.

Om het beter te begrijpen, maken we onze speelgoedklasse om te experimenteren:

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

Laten we eens kijken naar de attributen op het object met behulp van de ingebouwde dir() functie:

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

Van de bovenstaande lijst van attributen van het object, kunnen we zien dat self.name en self._age onveranderd lijken en zich op dezelfde manier gedragen.

__id is echter gemangeld tot _Person__id. Dit is de name mangling die de Python interpreter toepast. Hij doet dit om de variabele te beschermen tegen overriden in subklassen.

Nu, als we een subklasse van Person maken, zeg Employee, kunnen we niet gemakkelijk Person’s __id variabele overriden.

Het beoogde gedrag hier is bijna gelijk aan finale variabelen in Java en niet-virtuele in C++.

Single Trailing Underscore: var_

Zoals uitgelegd in PEP 8 docs:

Single trailing underscore naamgevingsconventie wordt gebruikt om conflicten met Python trefwoorden te vermijden.

Wanneer de meest geschikte naam voor een variabele al wordt gebruikt door een trefwoord, wordt de conventie van het toevoegen van een enkele underscore gevolgd om het naamgevingsconflict te doorbreken. Een typisch voorbeeld is het gebruik van class of andere trefwoorden als variabelen.

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

Double Leading and Trailing Underscore: __var__

Namen met dubbele underscores (“dunders”) zijn gereserveerd voor speciaal gebruik, zoals de__init__ methode voor object constructors, of __call__ methode om object aanroepbaar te maken. Deze methoden staan bekend als dunder methoden.

Voor zover het iemand betreft, is dit slechts een conventie, een manier voor het Python systeem om namen te gebruiken die niet conflicteren met door gebruikers gedefinieerde namen. Daarom zijn dunders slechts een conventie en worden ze ongemoeid gelaten door de Python interpreter.

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

De dunders bereiken het gewenste doel van het speciaal maken van bepaalde methoden terwijl ze ook gewoon hetzelfde zijn als andere gewone methoden in elk aspect behalve de naamgevingsconventie.

Om eerlijk te zijn, er is niets dat ons tegenhoudt om onze eigen dunder naam te schrijven, maar het is het beste om weg te blijven van het gebruik ervan in onze programma’s om botsingen te voorkomen met toekomstige veranderingen in de Python taal. (Zie mijn dit verhaal dat dunders uitvoerig beschrijft).

Enkele Underscore: _

Per conventie wordt een enkele op zichzelf staande underscore soms gebruikt als naam om aan te geven dat een variabele tijdelijk of onbeduidend is.

In de volgende lus hebben we bijvoorbeeld geen toegang nodig tot de lopende index en kunnen we “_” gebruiken om aan te geven dat het slechts een tijdelijke waarde is:

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

Alweer, deze betekenis is alleen “per conventie” en er is geen speciaal gedrag dat wordt geactiveerd in de Python-interpreter. De enkele underscore is gewoon een geldige variabele naam die soms wordt gebruikt voor dit doel.

Conclusies:

Kennis van de verschillende underscores patroon zal helpen bij het schrijven van onze code meer Pythonic. 😄

Hier volgt een korte samenvatting van onze 5 underscore patronen voor naamgevingsconventies, die we hierboven hebben behandeld.

  • Single Leading Underscore _var: Naamgevingsconventie die aangeeft dat de naam bedoeld is voor intern gebruik. Een hint voor programmeurs en niet afgedwongen door programmeurs.
  • Double Leading Underscore __var: Triggers naam mangling wanneer gebruikt in klasse context. Afgedwongen door de Python interpreter.
  • Single Trailing Underscore var_: Gebruikt bij conventie om naamgevingsconflicten met Python-keywords te vermijden.
  • Double Trailing Underscore __var__: Geeft speciale methoden aan die door de Python-taal zijn gedefinieerd.
  • Underscore _: Gebruikt als een naam voor tijdelijke variabelen.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.