Lima Jenis Penggunaan Underscore (_) di Python

Takagi Fujimaru 19 April 2018

Lima Jenis Penggunaan Underscore (_) di Python

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_trailing_underscore_

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_trailing_underscore__

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