Lima Jenis Penggunaan Underscore (_) di Python

Lima Jenis Penggunaan Underscore (_) di Python - CodePolitan.com
Di bahasa lain, underscore (_) biasanya dipakai untuk menulis nama variabel dan fungsi dengan teknik snake-case (ini_nama_variabel_snake_case). Tapi underscore () memiliki arti khusus di Python. Jika pembaca merupakan programmer Python, sintaks `for \ in range(10)atau__init__(self)` sudah cukup familiar.
Artikel ini akan membantu pembaca memahami penggunaan underscore di Python. Ada lima kasus penggunaan underscore di Python yaitu:
  1. Menyimpan nilai ekspresi terakhir di interpreter
  2. Mengabaikan nilai tertentu
  3. Memberikan arti khusus bagi variabel atau fungsi
  4. Untuk dipakai oleh fungsi Internationalization (i18n) atau Localization (i10n)
  5. Memberi penanda digit di sebuah angka

Saat dipakai di interpreter

Interpreter Python menyimpan ekspresi terakhir di variabel bernama '_'. Fitur ini sudah ada di interpreter CPython standar dan kita bisa juga memakainya di interpreter yang lain.
>>> 10 
10
>>> _
10
>>> _ * 3
30
>>> _ * 20
600

Mengabaikan suatu nilai

Underscore juag dipakai untuk mengabaikan nilai tertentu. Jika merasa kita tidak memerlukan sebuah nilai, kita bisa menuliskan underscore untuk menyimpannya.
# Mengabaikan suatu nilai saat unpacking
x, _, y = (1, 2, 3) # x = 1, y = 3
# Mengabaikan lebih dari value. Istilahnya "Extended Unpacking" dan hanya tersedia di Python 3.x
x, *_, y = (1, 2, 3, 4, 5) # x = 1, y = 5
# Mengabaikan index
for _ in range(10):
do_something()
# Mengabaikan value di lokasi tertentu.
for _, val in list_of_tuple:
do_something()

Memberikan arti khusus untuk nama fungsi atau variabel

PEP8 yang merupakan panduan penulis kode-kode Python mengenalkan 4 cara penulisan menggunakan _.

_single_leading_underscore

Aturan ini dipakai untuk mendeklarasikan variabel, fungsi, method, atau kelas private di sebuah module. Sebuah yang mengikuti aturan penulisan ini akan diabaikan saat pemanggilan from module impot *.
Karena Python tidak memiliki konsep private yang sesungguhnya, kita tidak bisa betul-betul mem-private-kan sesuatu dan tetap bisa memanggilnya dari module yang lain. Oleh karena itu, terkadang aturan ini disebut “weak internal use indicator”.
_internal_name = 'one_nodule' # private variable
_internal_version = '1.0' # private variable

class _Base: # private class
_hidden_factor = 2 # private variable
def __init__(self, price):
self._price = price
def _double_price(self): # private method
return self._price * self._hidden_factor
def get_double_price(self):
return self._double_price()

single_trailingunderscore

Aturan ini dipakai bisanya untuk menhindari konflik penamaan dengan keyword Python atau perintah yang lain.
Tkinter.Toplevel(master, class_='ClassName') # Avoid conflict with 'class' keyword
list_ = List.objects.get(1) # Avoid conflict with 'list' built-in type

__double_leading_underscore

Double underscore dipakai untuk menghindari konflik nama atribute antar kelas. (istialh "mangling" artinya compiler atau interpreter akan memodifikasi nama fungsi atau variabel tersebut dengan aturan khusus dan tidak menggunaan nama yang sama seperti yang tertulis) Aturan mangling di Python ialah dengan menambahkan "_ClassName" didepan atribut yang menggunakan double underscore. Sehingga saat kita menulis "_method" maka nama kelas yang di mangling-kan menjadi "_ClassName\_method".
class A:
def _single_method(self):
pass
def __double_method(self): # for mangling
pass
class B(A):
def __double_method(self): # for mangling
pass
Karena nama atribut yang menggunakan double underscore akan di mangling-kan, maka kita tidak bisa mengaksesnya dengan "ClassName.__method". Untuk detail lebih lengkap silahkan baca Python Naming.

__double_leading_and_trailingunderscore_\

Aturan penulis ini dipakai untuk variabel atau method khusus (yang disebut juga "magic methods") seperti __init__ dan __len__. Method ini memberikan fitur spesial atau melakukan sesuatu yang khusus. Misalnya, __file__ akan memberikan lokasi sebuah file Python, __eq__ akan dieksekusi saat ada perintah a == b.
Kita tentu saja bisa membuat method khusus seperti ini meskipun akan sangat jarang kasusnya dimana kita perlu membuat method tersebut.
class A:
def __init__(self, a): # method khusus untuk inisialisasi kelas
self.a = a
def __custom__(self): # method khusus buaan sendiri yang mungkin tidak akan pernah dibutuhkan
pass

Sebagai fungsi Internationalization (i18n) atau Localization (l10n)

Dalam Internationalization atau Localization penggunaan underscore hanyalah aturan menulis saja tidak memiliki fungsi secara sintaksis. Jadi, underscore tidak berarti itu merupakan fungsi i18n/l10n, ia hanyanya aturan menulis yang asal mulanya dari aturan C.
Library gettext misalnya menggunakan aturan ini, lalu DJango yang merupakan web framework Python mendukung i18n/l10n juga mengenalkan aturan ini.
# see official docs : https://docs.python.org/3/library/gettext.html
import gettext
gettext.bindtextdomain('myapplication','/path/to/my/language/directory')
gettext.textdomain('myapplication')
_ = gettext.gettext
# ...
print(_('This is a translatable string.'))

Memberi penanda di nilai angka

Fitur ini mulai ditambahkan di Python 3.6. Dengan underscore kita bisa memisahkan digit-digit angka agar lebih mudah dibaca.
dec_base = 1_000_000
bin_base = 0b_1111_0000
hex_base = 0x_1234_abcd
print(dec_base) # 1000000
print(bin_base) # 240
print(hex_base) # 305441741
Sumber: hackernoon.com

No comments