Bagaimana cara saya memberi nama fungsi yang mengembalikan nilai dalam Python?

13

Saya bingung memilih nama untuk fungsi saya di Python . Terkadang fungsi bawaan Python sangat penting seperti: printfungsi dan metode string find. Kadang-kadang mereka tidak seperti: lennamanya tidak penting seperti calculate_len, misalnya, dan typetidak find_type.

Saya dapat memahami bahwa printmengembalikan nilai yang tidak kami gunakan (yaitu None) dan melakukan sesuatu (yaitu menunjukkan string di layar), jadi namanya sangat penting.

Tetapi lenmengembalikan nilai yang kami gunakan dan melakukan sesuatu (yaitu menghitung berapa banyak item yang ada dalam urutan atau pemetaan.) Dan namanya tidak penting . Di sisi lain, findmetode string (as len) mengembalikan nilai yang kami gunakan dan melakukan sesuatu, dan namanya sangat penting .

Apa yang membuat menanyakan pertanyaan ini adalah bahwa saya menempatkan skrip yang mengenkripsi dan mendekripsi string menggunakan cipher Caesar untuk ditinjau. Peninjau mengatakan:

Hanya firasat: fungsi berfungsi. Jadi nama yang bagus untuk suatu fungsi adalah keharusan: Saya akan menggunakan rotate_letteralih-alih rotated_letter.

rotated_lettermengembalikan string huruf tunggal yang mewakili huruf yang dirotasi oleh angka. Saya tidak tahu apa yang lebih baik, saya gunakan rotated_letterkarena mengembalikan nilai, seperti randintfungsi dalam modul acak , bukan generate_randint.

Jadi, dalam hal ini, bagaimana saya harus memberi nama fungsi yang mengembalikan nilai yang akan digunakan? Haruskah saya membuat nama imperatif atau hanya kata benda . Dalam kasus lain jelas bagaimana melakukannya, seperti fungsi boolean , seperti is_evendan is_palindromekami hanya membuatnya seperti pertanyaan ya / tidak , dan juga fungsi yang hanya melakukan dan mengembalikan nilai yang tidak digunakan (yaitu None), seperti printdan metode daftar sort.

Mahmood Muhammad Nageeb
sumber
itu sebenarnya praktik yang sangat umum (saya akan mengatakan sebuah konvensi) untuk menggunakan perintah ketika fungsi penamaan. Misalnya bagaimana Anda memberi nama variabel yang menyimpan huruf yang diputar fungsi rotated_letter?
JoulinRouge
Itu bukan cara yang baik untuk memikirkan beberapa contoh Anda. len, misalnya, lebih baik dianggap sebagai "panjang" - Anda mendapatkan deskripsi meta-level dari argumennya.
Izkata

Jawaban:

10

Gunakan kata kerja yang wajar, kata benda jika lebih pendek dan tidak ambigu

Sebagian besar waktu, fungsi harus berupa kata kerja (imperatif) dan kelas, variabel, dan parameter harus berupa kata benda. Atribut juga harus berupa kata benda, termasuk yang dibuat menggunakan @property. Ini terutama terjadi pada fungsi yang memiliki efek samping. [1] Jika suatu fungsi mengembalikan sesuatu, Anda harus mengevaluasi apakah kata kerjanya menambahkan sesuatu atau hanya "noise":

  • make_list(foo)vs list(foo).: Kata benda lebih mudah dibaca daripada kata kerja. Juga, listsebenarnya adalah kelas, dan kelas harus menjadi kata benda.
  • open(foo)vs file(foo).: Kata kerja lebih mudah dibaca daripada kata benda, dan lebih masuk akal untuk memberikan "opsi" ke kata kerja daripada kata benda, jadi kata benda itu dihapus dengan Python 3. open()tetap menjadi satu-satunya "standar" [2] cara untuk membuat objek file dalam Python 3.
  • foo.get_bar()vs. foo.bar()vs. foo.bar(anggap foodan barkeduanya kata benda): Opsi pertama adalah benar, karena "get" tidak menambahkan apa pun yang kita belum tahu. Yang kedua adalah tepat jika barkeluar dari foooperasi berpotensi mahal dan / atau membawa efek samping (Anda mungkin juga mempertimbangkan Bar(foo)jika Barkelas). Yang ketiga sesuai jika ini adalah operasi yang murah tanpa efek samping, dan implementasi alternatif tidak mungkin membuatnya mahal .
  • xs.sort()vs. sorted(xs)if xsadalah daftar: Yang pertama adalah keharusan: Urutkan daftar. Ini mengubah daftar di tempat dan tidak mengembalikan apa pun. Yang kedua adalah deklaratif: Daftar yang diurutkan, yang persis apa yang dikembalikan. Keduanya adalah kata kerja.

[1]: Biasanya mengembalikan nilai dan memiliki efek samping sama-sama eksklusif kecuali Anda memiliki alasan desain yang menarik untuk menggabungkannya. Jadi fungsi yang memiliki efek samping mungkin seharusnya tidak mengembalikan apa pun dan karenanya membuatnya menjadi kata benda akan sangat sedikit masuk akal.
[2]: Ada beberapa operasi tingkat-lebih rendah di iomodul yang dapat digunakan untuk menambah atau menghapus buffering file, teks otomatis / decoding, dll, dan ini sebagian besar kata benda karena mereka adalah kelas berorientasi objek. Sebagian besar pengguna tidak perlu bermain-main dengan hal-hal ini secara langsung; sebagai gantinya, open()pilih kelas yang sesuai dan instantiate secara otomatis.

Kevin
sumber
Terima kasih! Dalam " foo.get_bar() vs.` foo.bar ()` vs. foo.bar" apa perbedaan antara yang kedua dan yang ketiga ?
Mahmood Muhammad Nageeb
Yang ketiga adalah properti atau atribut kosong. Yang kedua adalah metode.
Kevin
Jadi, jika saya mengerti, itu tepat untuk tidak membuat rotated_letterimperatif dan tetap deklaratif, kan?
Mahmood Muhammad Nageeb
Dalam hal ini saya tidak yakin apakah lettertersirat oleh konteks.
Kevin
+1 untuk disebutkan listadalah kelas
Dušan Maďar
0

rotated_lettertidak terlihat seperti metode. Sepertinya properti. Yang berarti bahwa ide pertama adalah melakukan:

var letter = caesar.rotated_letter

berharap lettermengandung nilai tipe string, bukan fungsi. Dari sana, Anda memilih nama yang berbeda, seperti:

def rotate_letter(self):
    pass

atau Anda menggunakan properti sebagai gantinya:

@property
def rotated_letter(self):
    return self.whatever

lendan typedinamai seperti itu karena nama lain akan panjang untuk diketik. Mereka banyak digunakan, dan mereka memiliki status khusus fungsi inti Python yang setiap programmer Python akan belajar pula, membuat nama mereka jauh lebih tidak relevan daripada nama perpustakaan pihak ketiga.

len, Terutama, adalah contoh yang baik dari apa yang Anda tidak harus melakukan di Anda kode: Anda diharapkan untuk menggunakan nama lengkap seperti length(kecuali bentuk pendek sangat populer, seperti max), dan menggunakan kata kerja, seperti compute_length. Atau bisa juga berupa properti: len([1, 5, 6])menjadi [1, 5, 6].length. Misalnya, di C #, bentuk kemudian digunakan: new [] { ... }.Length.

Perhatikan bahwa mungkin ada alasan historis juga untuk len: bahasa lain, seperti C #, lebih disukai Count, yang biasanya merupakan metode (meskipun sayangnya perilaku tersebut tidak konsisten melalui .NET Framework). Countadalah kata kerja, jadi secara intuitif, Anda cenderung menyebutnya sebagai metode.

Mengembalikan nilai atau melakukan suatu tindakan

Suatu fungsi selalu diharapkan untuk melakukan suatu tindakan. Jika hampir tidak mengembalikan nilai, itu harus berupa properti. Anda memiliki petunjuk bahwa fungsi tersebut harus diubah menjadi properti ketika:

  • Fungsi ini hampir tidak mengandung return ...pernyataan,

  • Nama fungsi yang muncul secara alami di pikiran Anda adalah get_something, seperti pada product.get_price().

Sekarang, jika Anda memiliki fungsi, itu bisa salah satu dari empat jenis:

  • Itu bisa murni, yaitu mengembalikan nilai tanpa mempengaruhi lingkungan. Contoh: road.measure_distance().

  • Ini dapat mempengaruhi lingkungan tanpa mengembalikan apa pun. Contoh: product_database.remove_record(1234).

  • Ini dapat mempengaruhi lingkungan dan mengembalikan nilai. Contoh: value.increment()digunakan seperti value++.

  • Ia tidak dapat melakukan apa-apa dan tidak mengembalikan apa pun. Contoh: time.sleep(1).

Ada beberapa kasus di mana nama bisa memberikan petunjuk kuat tentang jenis fungsi, tetapi dalam banyak kasus, Anda tidak akan dapat mengetahui jenisnya dari namanya.

Arseni Mourzenko
sumber
Saya menganggap jawabannya adalah "ya", tetapi saya harus bertanya: apakah Anda menjawab sepenuhnya dari perspektif Python? Karena dalam bahasa lain pemisahan fungsi vs properti Anda tidak selalu benar; itu juga tidak benar bahwa fungsi "harus melakukan suatu tindakan". Apakah ini konvensi dengan Python? (Saya menulis Python tetapi belum membaca semua PEP dan saya jelas BUKAN ahli. Saya tidak downvote, BTW).
Andres F.
@AndresF .: Saya menjawab dari perspektif Python. Dalam bahasa seperti Java di mana properti tidak ada, getSomethingdan setSomethingmerupakan nama yang biasa digunakan alih-alih properti.
Arseni Mourzenko