Różne zastosowania podkreśleń w konwencji nazewniczej wyjaśnione!!!

Rachit Tayal

Follow

Aug 6, 2019 – 5 min read

Podkreślnik _ jest specjalny w Pythonie. Podczas gdy podkreślnik jest używany dla zmiennych i funkcji w wielu językach, ale w Pythonie ma on specjalne znaczenie. Są one szeroko stosowane w różnych scenariuszach, w tym w przypadkach, gdy chcielibyśmy zignorować jakąś wartość, lub w deklaracjach zmiennych, metod itp.

Pojedyncze i podwójne podkreślenia mają znaczenie w nazwach zmiennych i metod Pythona. Niektóre z tych znaczeń wynikają jedynie z konwencji, podczas gdy niektóre z nich są wymuszane przez interpreter Pythona.

W tym artykule omówimy pięć wzorców podkreślników i konwencje nazewnictwa oraz to, jak wpływają one na zachowanie naszych programów w Pythonie. Zrozumienie tych pojęć będzie bardzo pomocne, szczególnie podczas pisania zaawansowanego kodu.

Pod koniec tego postu, będziemy mieli dobre zrozumienie tego, jak i gdzie używać jakiego wzorca podkreślenia w naszej konwencji nazewniczej. Więc zaczynajmy.

Single Leading Underscore: _var

Przedrostek podkreślenia jest przeznaczony jako wskazówka dla innego programisty, że zmienna lub metoda zaczynająca się od pojedynczego podkreślenia jest przeznaczona do użytku wewnętrznego. Konwencja ta została zdefiniowana w PEP 8.

Nazwa poprzedzona podkreślnikiem (np. _spam) powinna być traktowana jako niepubliczna część API (niezależnie od tego, czy jest to funkcja, metoda czy członek danych). Powinien być traktowany jako szczegół implementacji i podlegać zmianom bez powiadomienia.

Przyjrzyjrzyj się następującemu przykładowi:

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

Zainicjujmy powyższą klasę i spróbujmy uzyskać dostęp do atrybutów name i _age.

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

Więc, pojedynczy prefiks podkreślenia w Pythonie jest jedynie uzgodnioną konwencją i nie nakłada żadnych ograniczeń na dostęp do wartości tej zmiennej.

Double Leading Underscore: __var

Użycie podwójnego podkreślenia (__) przed nazwą (konkretnie nazwą metody) nie jest konwencją; ma ono określone znaczenie dla interpretera.

Python magluje te nazwy i jest ono używane w celu uniknięcia kolizji nazw z nazwami zdefiniowanymi przez podklasy.

To jest również nazywane manglingiem nazw – interpreter zmienia nazwę zmiennej w sposób, który utrudnia tworzenie kolizji, gdy klasa jest rozszerzana później.

Aby to lepiej zrozumieć, stworzymy naszą klasę-zabawkę do eksperymentów:

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

Przyjrzyjrzyjmy się atrybutom jej obiektu, używając wbudowanej funkcji 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 powyższej listy atrybutów obiektu możemy zobaczyć, że self.name i self._age pozostają niezmienione i zachowują się tak samo.

Jednakże __id jest zamienione na _Person__id. Jest to przekształcenie nazwy, które stosuje interpreter Pythona. Robi to, aby chronić zmienną przed nadpisaniem w podklasach.

Teraz, jeśli stworzymy podklasę Person, powiedzmy Employee, nie będziemy mogli łatwo nadpisać Person zmiennej __id.

Zamierzone zachowanie tutaj jest prawie równoważne zmiennym końcowym w Javie i nie-wirtualnym w C ++.

Single Trailing Underscore: var_

Jak wyjaśniono w dokumencie PEP 8:

Konwencja nazewnictwa z pojedynczym podkreśleniem jest używana w celu uniknięcia konfliktów ze słowami kluczowymi Pythona.

Gdy najbardziej pasująca nazwa zmiennej jest już zajęta przez słowo kluczowe, stosuje się konwencję dołączania pojedynczego podkreślenia, aby przerwać konflikt nazw. Typowy przykład obejmuje użycie class lub innych słów kluczowych jako zmiennych.

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

Podwójne podkreślenie wiodące i śledzące: __var__

Nazwy, które mają wiodące i ciągnące się podwójne podkreślenia („dundery”) są zarezerwowane do specjalnego użytku, jak metoda__init__ dla konstruktorów obiektów, lub metoda __call__, aby uczynić obiekt wywoływalnym. Metody te są znane jako metody dunder.

Jak na razie jest to tylko konwencja, sposób na używanie przez system Pythona nazw, które nie będą kolidować z nazwami zdefiniowanymi przez użytkownika. Dlatego dundery są tylko konwencją i są pozostawione nietknięte przez interpreter Pythona.

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

Dundery osiągają pożądany cel uczynienia pewnych metod specjalnymi, jednocześnie czyniąc je takimi samymi jak inne zwykłe metody w każdym aspekcie z wyjątkiem konwencji nazewnictwa.

Będąc szczerym, nic nie powstrzymuje nas przed napisaniem własnej nazwy dundera, ale najlepiej jest trzymać się z dala od używania ich w naszych programach, aby uniknąć kolizji z przyszłymi zmianami w języku Pythona. (Odnieś się do mojego artykułu, który szczegółowo omawia dundery).

Single Underscore: _

Per convention, pojedynczy samodzielny podkreślnik jest czasami używany jako nazwa, aby wskazać, że zmienna jest tymczasowa lub nieistotna.

Na przykład w następującej pętli nie potrzebujemy dostępu do działającego indeksu i możemy użyć „_„, aby wskazać, że jest to tylko wartość tymczasowa:

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

Again, to znaczenie jest „per convention” tylko i nie ma specjalnego zachowania wywołanego w interpreterze Pythona. Pojedynczy podkreślnik jest po prostu poprawną nazwą zmiennej, która jest czasami używana w tym celu.

Wnioski:

Znajomość różnych wzorów podkreślników pomoże w pisaniu naszego kodu bardziej Pythonic. 😄

Tutaj znajduje się szybkie podsumowanie naszych 5 wzorców podkreślników dla konwencji nazewniczych, które omówiliśmy powyżej.

  • Single Leading Underscore _var: Konwencja nazewnicza wskazująca, że nazwa jest przeznaczona do użytku wewnętrznego. Wskazówka dla programistów i nie jest wymuszana przez programistów.
  • Double Leading Underscore __var: Wyzwala mangling nazwy, gdy jest używana w kontekście klasy. Wymuszane przez interpreter Pythona.
  • Single Trailing Underscore var_: Używane przez konwencję, aby uniknąć konfliktów nazw ze słowami kluczowymi Pythona.
  • Double Trailing Underscore __var__: Wskazuje specjalne metody zdefiniowane przez język Pythona.
  • Underscore _: Używany jako nazwa zmiennych tymczasowych.

.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.