Apa konvensi penamaan di Python untuk nama variabel dan fungsi?

773

Berasal dari latar belakang C #, konvensi penamaan untuk variabel dan nama metode biasanya camelCase atau PascalCase:

// C# example
string thisIsMyVariable = "a"
public void ThisIsMyMethod()

Dalam Python, saya telah melihat di atas tetapi saya juga melihat garis bawah yang digunakan:

# python example
this_is_my_variable = 'a'
def this_is_my_function():

Apakah ada gaya pengkodean yang lebih disukai dan definitif untuk Python?

sinar
sumber

Jawaban:

867

Lihat Python PEP 8: Fungsi dan Nama Variabel :

Nama fungsi harus huruf kecil, dengan kata-kata dipisahkan oleh garis bawah seperlunya untuk meningkatkan keterbacaan.

Nama variabel mengikuti konvensi yang sama dengan nama fungsi.

mixedCase hanya diperbolehkan dalam konteks di mana itu sudah menjadi gaya yang berlaku (misalnya threading.py ), untuk mempertahankan kompatibilitas ke belakang.

S.Lott
sumber
127
PEP = Proposal Peningkatan Python.
Peter Mortensen
8
@RickyRobinson Apa editor kode mati otak yang Anda gunakan, yang tidak tahu bahwa garis bawah terus kata? Banyak sekali yang gratis. Saya menggunakan Notepad ++, jika IDE tidak tersedia. Untuk itu, bisa mengunduh template untuk mengedit python. (Yang lain dapat merekomendasikan unduhan gratis yang bahkan lebih bermanfaat.)
ToolmakerSteve
57
Satu kasus untuk gaya garis bawah adalah bahwa Anda dapat menggunakan kata-kata satu huruf dengan lebih baik. Sebagai contoh (yang agak konyol), findMeAClassmungkin lebih jelek daripada find_me_a_class.
heltonbiker
9
Saya menemukan bahwa konvensi nama variabel huruf kecil semua tidak cocok dalam komputasi ilmiah, di mana orang sering menemukan konstanta terkenal, tensor dll yang dilambangkan dengan huruf kapital.
andreasdr
12
@rr PEP8 adalah "Panduan Gaya", dan menggambarkan dirinya sebagai Konvensi, BUKAN Standar. Ini juga dengan jelas menjelaskan alasan untuk tidak selalu mengikuti "aturan" itu.
The Tahaan
710

The Google Python Style Guide memiliki konvensi berikut:

module_name, package_name, ClassName, method_name, ExceptionName, function_name, GLOBAL_CONSTANT_NAME, global_var_name, instance_var_name, function_parameter_name, local_var_name.

Skema penamaan yang serupa harus diterapkan ke a CLASS_CONSTANT_NAME

JohnTESlade
sumber
37
a) Saya suka contoh - terima kasih. b) Campuran CamelCase dan garis bawah yang tidak menarik? Tapi: Menjadi orang baru di Python dan model datanya yang lebih fleksibel, saya yakin ada pemikiran kuat di balik panduan Google ...
Matthew Cornell
19
@MatthewCornell tidak buruk asalkan Anda tetap melakukannya. Ini sebenarnya membuat keterbacaan lebih mudah jika Anda tahu bahwa fungsi memiliki garis bawah dan kelas tidak.
Pithikos
1
@ MatthewCornell Saya tidak akan menganggap itu ada hubungannya dengan python. Go benar-benar menegakkan standar kecantikan yang sewenang-wenang dan akan gagal dikompilasi jika Anda tidak mematuhi, misalnya, konvensi kurawal kurawal mereka. Pada dasarnya, ini adalah dadu, apakah seseorang benar-benar memiliki pemikiran yang cermat, atau benar-benar menyukai cara mereka melakukan sesuatu.
Parthian Shot
Apakah Anda menganggap atribut statis konstan sebagai GLOBAL_CONSTANT_NAME? Ini tidak terlalu global karena berada dalam ruang lingkup kelas.
James T.
lalu berjalan masuk property... mungkin ini soal
kepura
240

David Goodger (dalam "Code Like a Pythonista" di sini ) menjelaskan rekomendasi PEP 8 sebagai berikut:

  • joined_lower untuk fungsi, metode, atribut, variabel

  • joined_loweratau ALL_CAPSuntuk konstanta

  • StudlyCaps untuk kelas

  • camelCase hanya untuk menyesuaikan diri dengan konvensi yang sudah ada sebelumnya

lepas
sumber
3
+1 contoh visual. Meskipun saya tidak bisa melihat di mana PEP8 menyarankan joined_loweruntuk konstanta , hanya "semua huruf kapital dengan menggarisbawahi kata-kata yang memisahkan". Penasaran juga tentang fitur enum baru .
Bob Stein
1
StudlyCaps for classesadalah aturan universal yang hebat untuk kelas di hampir semua bahasa. Lalu mengapa beberapa kelas built-in python (seperti datetime.datetimetidak mengikuti konvensi ini?
Prahlad Yeri
3
@PrahladYeri: Sayangnya, unittest.TestCase.assertEqualdan teman-teman juga tidak mengikuti konvensi snake_case. Yang benar adalah bahwa bagian-bagian dari perpustakaan standar Python dikembangkan sebelum konvensi telah dipadatkan, dan kita sekarang terjebak dengan mereka.
wchargin
3
CamelCase membingungkan karena beberapa orang mengatakan itu "camelCase" (juga dikenal sebagai "mixedCase") dan beberapa orang mengatakan itu "CamelCase" (juga dikenal sebagai "StudlyCaps"). Sebagai contoh, PEP menyebutkan "CamelCase" ketika Anda menyebutkan "camelCase".
Pro Q
tautan Anda di sini sudah mati, mungkin itu harus diganti dengan sesuatu seperti david.goodger.org/projects/pycon/2007/idiomatic
Wolf
42

Seperti yang diakui Panduan Gaya untuk Kode Python ,

Konvensi penamaan pustaka Python agak berantakan, jadi kita tidak akan pernah mendapatkan ini sepenuhnya konsisten

Perhatikan bahwa ini merujuk hanya ke perpustakaan standar Python . Jika mereka tidak bisa mendapatkan yang konsisten, maka ada hampir tidak banyak harapan untuk memiliki umumnya-ditaati-konvensi untuk semua kode Python, apakah ada?

Dari itu, dan diskusi di sini, saya akan menyimpulkan bahwa itu bukan dosa yang mengerikan jika seseorang terus menggunakan misalnya konvensi penamaan Java atau C # (jelas dan mapan) untuk variabel dan fungsi ketika menyeberang ke Python. Ingatlah, tentu saja, yang terbaik adalah mematuhi gaya apa pun yang berlaku untuk basis kode / proyek / tim. Seperti yang ditunjukkan oleh Panduan Gaya Python, konsistensi internal paling penting.

Jangan ragu untuk menganggap saya sebagai bidat. :-) Seperti OP, saya bukan "Pythonista", belum.

Jonik
sumber
32

Ada PEP 8 , seperti yang ditunjukkan oleh jawaban lain, tetapi PEP 8 hanya panduan gaya untuk perpustakaan standar, dan itu hanya dianggap sebagai Injil di dalamnya. Salah satu penyimpangan yang paling sering dari PEP 8 untuk potongan kode lainnya adalah penamaan variabel, khususnya untuk metode. Tidak ada gaya tunggal yang mendominasi, walaupun mempertimbangkan volume kode yang menggunakan mixedCase, jika seseorang ingin membuat sensus ketat seseorang mungkin akan berakhir dengan versi PEP 8 dengan mixedCase. Ada sedikit penyimpangan lain dari PEP 8 yang cukup umum.

Thomas Wouters
sumber
9
Ini mungkin benar di '08 ketika ini dijawab, tetapi saat ini hampir semua perpustakaan besar menggunakan konvensi penamaan PEP 8.
Thane Brimhall
29

Seperti disebutkan, PEP 8 mengatakan digunakan lower_case_with_underscoresuntuk variabel, metode, dan fungsi.

Saya lebih suka menggunakan lower_case_with_underscoresuntuk variabel dan mixedCaseuntuk metode dan fungsi membuat kode lebih eksplisit dan mudah dibaca. Dengan demikian mengikuti Zen dari Python "eksplisit lebih baik daripada implisit" dan "jumlah keterbacaan"

claytron
sumber
3
+1 Saya beralih ke dua (saya menggunakan mixedCase untuk variabel), tetapi memiliki segalanya yang lebih berbeda seperti itu membantu membuatnya segera jelas apa yang Anda hadapi, terutama karena Anda dapat membagikan fungsi.
Xiong Chiamiov
2
Padahal "Keterbacaan" sangat subyektif. Saya menemukan metode dengan garis bawah lebih mudah dibaca.
Pithikos
Preferensi Anda adalah intuisi awal saya yang berasal dari banyak tahun pembangunan Jawa. Saya suka menggunakan _ untuk variabel, tetapi dari mata, itu hanya terlihat sedikit lucu bagi saya untuk fungsi dan metode.
Michael Szczepaniak
21

lebih jauh dengan apa yang telah dijawab @JohnTESlade. Panduan gaya python Google memiliki beberapa rekomendasi yang cukup rapi,

Nama yang Harus Dihindari

  • nama karakter tunggal kecuali untuk penghitung atau iterator
  • tanda hubung (-) dalam nama paket / modul apa saja
  • \__double_leading_and_trailing_underscore__ names (disediakan oleh Python)

Konvensi penamaan

  • "Internal" berarti internal ke modul atau dilindungi atau pribadi di dalam kelas.
  • Prepending satu garis bawah (_) memiliki beberapa dukungan untuk melindungi variabel dan fungsi modul (tidak termasuk dengan impor * dari). Menempatkan double garis bawah (__) ke variabel instan atau metode berfungsi secara efektif untuk membuat variabel atau metode privat untuk kelasnya (menggunakan nama mangling).
  • Tempatkan kelas terkait dan fungsi tingkat atas bersama-sama dalam sebuah modul. Tidak seperti Java, tidak perlu membatasi diri untuk satu kelas per modul.
  • Gunakan CapWordsuntuk nama kelas, tetapi lower_with_under.pyuntuk nama modul. Meskipun ada banyak modul yang ada bernama CapWords.py, ini sekarang tidak disarankan karena membingungkan ketika modul diberi nama setelah kelas. ("tunggu - apakah saya menulis import StringIOatau from StringIO import StringIO?")

Pedoman berasal dari Rekomendasi Guido masukkan deskripsi gambar di sini

Sufiyan Ghori
sumber
17

Kebanyakan orang python lebih suka garis bawah, tetapi bahkan saya menggunakan python sejak lebih dari 5 tahun sekarang, saya masih tidak suka mereka. Mereka hanya terlihat jelek bagiku, tapi mungkin itu semua Jawa di kepalaku.

Saya hanya suka CamelCase lebih baik karena lebih cocok dengan cara kelas dinamai, Rasanya lebih logis untuk memilikinya SomeClass.doSomething()daripada SomeClass.do_something(). Jika Anda melihat-lihat dalam indeks modul global dalam python, Anda akan menemukan keduanya, yang disebabkan oleh fakta bahwa itu adalah kumpulan perpustakaan dari berbagai sumber yang tumbuh lembur dan bukan sesuatu yang dikembangkan oleh satu perusahaan seperti Sun dengan aturan pengkodean yang ketat . Saya akan mengatakan intinya adalah: Gunakan apapun yang Anda suka lebih baik, itu hanya masalah selera pribadi.

André
sumber
10
Saya datang dari latar belakang Java, dan saya menemukan garis bawah bertele-tele dan tidak menarik, dengan hanya pendapat yang terakhir. Penamaan dalam beberapa hal adalah keseimbangan antara keterbacaan dan singkatnya. Unix berjalan terlalu jauh, tetapi en.wikipedia.org/wiki/Domain-specific_language-nya terbatas. CamelCase dapat dibaca karena tutupnya, tetapi tidak memiliki karakter tambahan. 2c
Matthew Cornell
2
Bagi saya garis bawah menarik dalam fungsi / metode karena saya melihat setiap garis bawah sebagai pemisah untuk namespace virtual (di kepala saya). Cara yang saya dapat dengan mudah mengetahui bagaimana nama fungsi baru saya / metode: make_xpath_predicate, make_xpath_expr, make_html_header,make_html_footer
Pithikos
3
Anda tidak (biasanya) menelepon SomeClass.doSomething()(metode statis umumnya jarang) yang biasa Anda hubungian_instance.do_something()
Dave
15

Secara pribadi saya mencoba menggunakan CamelCase untuk kelas, metode dan fungsi mixedCase. Variabel biasanya dipisahkan garis bawah (bila saya ingat). Dengan cara ini saya bisa melihat sekilas apa yang sebenarnya saya panggil, daripada semuanya tampak sama.

crystalattice
sumber
15
Kasing camel dimulai dengan huruf kecil IIRC seperti "camelCase".
UnkwnTech
11
Saya pikir crystalattice sudah benar - setidaknya, penggunaannya konsisten dengan penggunaan di PEP8 (CamelCase dan mixedCase).
Jarrett
1
@UnkwnTech Istilah untuk FirstLetterUpper kadang-kadang disebut PascalCase
SurpriseDog
CamelCase atau camelCase? hanya ingin tahu.
Sumit Pokhrel
11

Ada sebuah makalah tentang ini: http://www.cs.kent.edu/~jmaletic/papers/ICPC2010-CamelCaseUnderScoreClouds.pdf

TL; DR Dikatakan bahwa snake_case lebih mudah dibaca daripada camelCase. Itu sebabnya bahasa modern menggunakan (atau seharusnya menggunakan) ular di mana pun mereka bisa.

alebian
sumber
9
Menariknya, itu juga mengatakan, "Hasil penelitian ini mungkin tidak selalu berlaku untuk pengidentifikasi tertanam dalam kode sumber. Sangat mungkin bahwa pengidentifikasi berbasis cam dapat bertindak sebagai elemen gestalt yang lebih baik ketika tertanam dalam konstruksi pemrograman."
rob3c
2

Gaya pengkodean biasanya merupakan bagian dari standar kebijakan / konvensi internal organisasi, tetapi saya pikir secara umum, gaya all_lower_case_underscore_separator (juga disebut snake_case) paling umum digunakan dalam python.

fuentesjr
sumber
0

Saya pribadi menggunakan konvensi penamaan Java ketika berkembang dalam bahasa pemrograman lain karena konsisten dan mudah diikuti. Dengan begitu saya tidak terus-menerus bergumul tentang konvensi apa yang harus digunakan yang seharusnya tidak menjadi bagian tersulit dari proyek saya!

bradylange
sumber
Saya agak setuju. Jika bahasa X hanya sejumlah kecil proyek, pergantian konteks tentang cara memformat teks dapat menjadi beban. Cegukan utama adalah bahwa perpustakaan akan memiliki panggilan dalam satu gaya ( library_function(my_arg)).
Lan
-2

Biasanya, satu mengikuti konvensi yang digunakan di perpustakaan standar bahasa.

yfeldblum
sumber