Konvensi penamaan Python untuk modul

102

Saya memiliki modul yang tujuannya adalah untuk mendefinisikan kelas yang disebut "nib". (dan beberapa kelas terkait juga.) Bagaimana saya harus memanggil modul itu sendiri? "ujung pena"? "nibmodule"? Ada yang lain?

Ram Rachum
sumber

Jawaban:

110

Hanya ujung pena. Beri nama kelas Nib, dengan huruf besar N. Untuk lebih lanjut tentang konvensi penamaan dan saran gaya lainnya, lihat PEP 8 , panduan gaya Python.

Stephan202
sumber
2
Apakah sebagian besar proyek Python mengikuti konvensi ini? Karena saya perhatikan kelas bawaan dalam huruf kecil, misalnya daftar, string, dll.
Ram Rachum
4
Anda mengamati bahwa tipe bawaan sudah benar. Namun, ini jelas merupakan pengecualian. Sebagian besar kelas lain yang ditentukan di perpustakaan standar menggunakan huruf besar.
Stephan202
2
Saya pikir ini adalah konvensi yang benar, tetapi ada masalah yang melekat dengannya, setidaknya menurut saya. Katakanlah saya memiliki kelas yang dipanggil Client, dan dapat dimengerti bahwa saya sering membuat contoh yang ingin saya hubungi client. Tetapi menurut konvensi Anda, nama modulnya adalah client, jadi saya selalu harus memberi nama instance saya dengan sesuatu yang tidak wajar client_instance. Apa pendapat Anda tentang masalah ini?
Ray
3
@Ray Tapi katakan konvensi itu untuk memberi nama modul Client, maka itu akan bentrok dengan nama kelas Client. Karena hanya ada 3 kemungkinan varian penamaan ( client, Clientatau CLIENT) akan selalu ada bentrokan antara dua instance, kelas, modul, atau konstanta. Saya percaya ada lebih sedikit kali Anda memberi nama modul Anda sama sebagai instance atau konstanta daripada kelas, dan oleh karena itu konvensi penamaan yang lebih baik dari kemungkinan lainnya. Ini juga akan membuat pengimporan dari modul lebih mudah dibaca karena Anda biasanya mengimpor kelas dan konstanta daripada variabel.
Ted Klein Bergman
2
Alasan mengapa builtin adalah huruf kecil adalah untuk menyiratkan bahwa mereka diimplementasikan di C daripada python.
Har
41

Saya akan menyebutnya nib.py. Dan saya juga akan menamai kelas Nib.

Dalam proyek python yang lebih besar yang saya kerjakan, kami memiliki banyak modul yang pada dasarnya mendefinisikan satu kelas penting. Nama kelas dimulai dengan huruf kapital. Modul diberi nama seperti kelas dalam huruf kecil. Ini mengarah ke impor seperti berikut:

from nib import Nib
from foo import Foo
from spam.eggs import Eggs, FriedEggs

Ini seperti meniru cara Java. Satu kelas per file. Tetapi dengan fleksibilitas tambahan, Anda selalu dapat menambahkan kelas lain ke satu file jika itu masuk akal.

rincewind
sumber
27

Saya tahu solusi saya tidak terlalu populer dari sudut pandang pythonic, tetapi saya lebih suka menggunakan pendekatan Java dari satu modul-> satu kelas, dengan modul yang dinamai sebagai kelas. Saya mengerti alasan di balik gaya python, tetapi saya tidak terlalu suka memiliki file yang sangat besar yang berisi banyak kelas. Saya merasa sulit untuk menjelajah, meski terlipat.

Alasan lainnya adalah kontrol versi: memiliki file besar berarti komitmen Anda cenderung berkonsentrasi pada file itu. Hal ini berpotensi menyebabkan lebih banyak konflik yang harus diselesaikan. Anda juga kehilangan informasi log tambahan yang komit Anda mengubah file tertentu (karena itu melibatkan kelas tertentu). Sebagai gantinya Anda melihat modifikasi pada file modul, dengan hanya komentar komit untuk memahami modifikasi apa yang telah dilakukan.

Kesimpulannya, jika Anda lebih suka filosofi python, carilah saran dari posting lain. Jika Anda lebih memilih filosofi seperti java, buat Nib.py yang berisi kelas Nib.

Stefano Borini
sumber
1
Masalah yang disebutkan disebabkan oleh batasan di editor, dan dalam penggunaan alat kontrol versi, bukan oleh bahasa atau gaya pemrograman. Satu kelas per file merusak struktur kode. Gunakan spyderatau editor serupa untuk melihat ringkasan kelas Anda untuk membantu navigasi, dan dua panel dengan file yang sama terbuka pada keduanya. Baca juga PEP8. Python untuk menulis Python, dan Java untuk Java, tetapi Python bukan untuk menulis Java.
Ioannis Filippidis
5
@IoannisFilippidis: Jika saya harus meletakkan semua kelas untuk modul dalam satu file dalam ukuran kode yang biasanya saya kelola, saya bahkan tidak akan dapat membuka file tersebut, tabrakan dengan kolega lain akan meroket, dan bos saya akan meludahi saya wajah (secara kiasan, itu saja) untuk mengusulkannya. Pendekatan file tunggal tidak berskala, PEP-8 atau tidak.
Stefano Borini
2
@StefanoBorini: PEP8 tidak memerlukan pendekatan file tunggal. Satu kelas per modul dan satu file per (unit kode) adalah dua ekstrem dari spektrum yang sangat luas. Jika Anda melihat ukuran file yang sangat besar dengan satu file per modul, Anda mungkin harus mempertimbangkan untuk merevisi pendekatan Anda untuk memecah paket menjadi modul.
Chintalagiri Shashank
22

ujung pena baik-baik saja. Jika ragu, lihat panduan gaya Python.

Dari PEP 8 :

Nama Paket dan Modul Modul harus memiliki nama yang pendek, semuanya menggunakan huruf kecil. Garis bawah dapat digunakan dalam nama modul jika itu meningkatkan keterbacaan. Paket Python juga harus memiliki nama yang pendek, semuanya huruf kecil, meskipun penggunaan garis bawah tidak disarankan.

Karena nama modul dipetakan ke nama file, dan beberapa sistem file tidak membedakan huruf besar / kecil dan memotong nama yang panjang, penting agar nama modul dipilih agar cukup pendek - ini tidak akan menjadi masalah di Unix, tetapi mungkin saja masalah ketika kode diangkut ke versi Mac atau Windows yang lebih lama, atau DOS.

Ketika modul ekstensi yang ditulis dalam C atau C ++ memiliki modul Python yang menyertai yang menyediakan antarmuka tingkat yang lebih tinggi (misalnya lebih berorientasi objek), modul C / C ++ memiliki garis bawah utama (misalnya _socket).

thedz
sumber
1
uhm ... ini memukul perutku. Saya menggunakan awalan garis bawah dalam paket / modul untuk sesuatu yang sama sekali berbeda (referensi monty python dimaksudkan).
Stefano Borini
0

Dari PEP-8: Nama Paket dan Modul :

Modul harus memiliki nama yang pendek, semuanya huruf kecil. Garis bawah dapat digunakan dalam nama modul jika itu meningkatkan keterbacaan.

Paket Python juga harus memiliki nama yang pendek, semuanya huruf kecil, meskipun penggunaan garis bawah tidak disarankan.

Ketika modul ekstensi yang ditulis dalam C atau C ++ memiliki modul Python yang menyertai yang menyediakan antarmuka tingkat yang lebih tinggi (misalnya lebih berorientasi objek), modul C / C ++ memiliki garis bawah utama (misalnya _socket).

Ehsan
sumber
-3

Modul foo di python akan sama dengan file kelas Foo di Java

atau

Modul foobar di python akan sama dengan file kelas FooBar di Java

Oded Breiner
sumber