Mengapa generator dan fungsi python berbagi kata kunci "def"?

10

Pertimbangkan yang berikut ini:

def some_function():
    return 1

def some_generator():
    yield 1

Dalam kode di atas, some_functionadalah fungsi, sedangkan some_generatorgenerator. Mereka terlihat sangat mirip.

Masalah yang saya miliki ketika membaca kode adalah bahwa saya perlu memindai setiap baris dalam "fungsi" mencari yieldkata kunci sebelum saya dapat menentukan apakah itu sebenarnya sebuah fungsi atau generator!

Sepertinya bagi saya bahwa menggunakan kata kunci yang berbeda untuk generator akan lebih masuk akal, misalnya:

gen some_generator():
    yield 1

Apa manfaat menggunakan defkata kunci untuk generator dan fungsi? Mengapa kata kunci baru tidak diperkenalkan ke fungsi dan generator yang terpisah?

Derek Kwok
sumber
Saya tidak tahu jawaban yang sebenarnya, tetapi saya sering mulai menulis fungsi yang mengembalikan daftar, lalu mengonversi ke generator ketika tampaknya benar. Memiliki kecocokan sintaksis membuat ini lebih alami.
Gort the Robot
2
@StevenBurnap Saran Derek untuk menggunakan sesuatu seperti genbukannya deftidak akan membuat transformasi itu secara signifikan lebih berat.
jamesdlin
2
Secara umum, perancang bahasa biasanya mencoba menghindari menambahkan kata kunci yang tidak perlu. Setiap kata kunci yang mereka tambahkan adalah pengidentifikasi bahwa program tidak boleh digunakan untuk tujuan lain.
jamesdlin
@ jamesdlin: Tetapi pertanyaannya adalah bahwa kata kunci baru akan diperlukan .
Giorgio
1
@ jamesdlin: Tentu saja Anda dapat membedakan fungsi dan generator dengan melihat tubuh mereka, tetapi pertanyaannya berpendapat bahwa menggunakan kata kunci yang berbeda akan membuat kode lebih mudah dibaca.
Giorgio

Jawaban:

14

"Apa manfaat menggunakan kata kunci def untuk generator dan fungsi?"

Meskipun mereka secara mekanis berbeda, dalam praktiknya ketika saya menggunakannya mereka sering secara efektif sama dengan saya secara konseptual (saya tidak berpikir banyak tentang memanggil range()vs xrange()).

Dalam hal memahami apa fungsi semua tentang dengan cepat, saya setuju ada sesuatu yang hilang dengan penggunaan def, tetapi hal-hal tidak boleh terlalu dikaburkan dalam fungsi untuk memulai.

Bahkan implisit return Nonedapat membingungkan perilaku yang dimaksudkan dari suatu fungsi setelah sedikit kondisional (seperti pada, adalah return Nonedimaksudkan sebagai perilaku akhir atau kekeliruan dalam logika). Tapi itu hanya kepercayaan saya tentang hal itu.

Saya tidak merasa argumen saya sangat meyakinkan, jadi saya hanya akan menunda PEP 255 :

Masalah: Perkenalkan kata kunci baru lainnya (misalnya, "gen" atau "generator") sebagai ganti "def", atau ubah sintaksnya, untuk membedakan fungsi generator dari fungsi non-generator.

Con: Dalam praktik (bagaimana Anda berpikir tentang mereka), generator adalah fungsi, tetapi dengan twist yang mereka dapat dilanjutkan. Mekanika bagaimana mereka diatur adalah masalah teknis yang relatif kecil, dan memperkenalkan kata kunci baru tidak akan terlalu menekankan mekanika bagaimana generator memulai (bagian penting tapi kecil dari kehidupan generator).

Pro: Pada kenyataannya (bagaimana Anda berpikir tentang mereka), fungsi generator sebenarnya adalah fungsi pabrik yang menghasilkan generator-iterator seolah-olah dengan sihir. Dalam hal ini mereka sangat berbeda dari fungsi non-generator, bertindak lebih seperti konstruktor daripada fungsi, sehingga menggunakan kembali "def" paling membingungkan. Pernyataan "hasil" yang terkubur dalam tubuh tidak cukup memperingatkan bahwa semantiknya sangat berbeda.

BDFL: "def" itu tetap. Tidak ada argumen di kedua sisi yang benar-benar meyakinkan, jadi saya telah berkonsultasi dengan intuisi perancang bahasa saya. Ini memberitahu saya bahwa sintaks yang diusulkan dalam PEP tepat - tidak terlalu panas, tidak terlalu dingin. Tapi, seperti Oracle di Delphi dalam mitologi Yunani, itu tidak memberi tahu saya alasannya, jadi saya tidak memiliki bantahan untuk argumen terhadap sintaksis PEP. Yang terbaik yang bisa saya hasilkan (selain menyetujui bantahan ... sudah dibuat) adalah "FUD". Jika ini telah menjadi bagian dari bahasa sejak hari pertama, saya sangat meragukan itu akan membuat halaman "Python Warts" Andrew Kuchling.

quaspas
sumber
1
Perlu dicatat bahwa konstruksi sintaks baru await(dan async withdan async for) yang ditambahkan dalam PEP 492 , yang bekerja sangat mirip dengan itu yield from, membutuhkan fungsi yang digunakan untuk dideklarasikan menggunakan async defbukan sebagai adil def.
Feuermurmel
2
  1. Menambahkan kata kunci baru berisiko melanggar program yang ada. Perancang bahasa umumnya mencoba menghindari menambahkan kata kunci baru, terutama untuk fitur bahasa yang ditambahkan setelah bahasa tersebut telah mendapatkan popularitas. Setiap kata kunci yang mereka tambahkan adalah pengidentifikasi bahwa program tidak boleh digunakan untuk tujuan lain, jadi menambahkan kata kunci berpotensi merusak program yang ada. Desainer bahasa harus mempertimbangkan manfaat kata kunci baru terhadap biaya.

  2. Saya ragu bahwa mendefinisikan kata kunci terpisah untuk generator akan memiliki banyak manfaat. Untuk memahami apakah simbol sesuai dengan nama fungsi atau nama generator adalah sesuatu yang penting bagi penelepon, dan penelepon tidak harus (dan terkadang tidak dapat) melihat kata kunci apa yang digunakan untuk mengimplementasikannya. Itulah tanggung jawab konvensi dan dokumentasi penamaan yang lebih baik.

jamesdlin
sumber
1

Generator adalah fungsi yang mengevaluasi malas. Mengingat bahwa mereka adalah hal yang sama pada dasarnya, masuk akal bahwa mereka akan menggunakan kata kunci yang sama. Salah satu opsi mungkin menggunakan komentar untuk mengidentifikasi mana yang untuk contoh tertentu:

def some_function(): #This is a function.
    return 1

def some_generator(): #This is a generator.
    yield 1
Insinyur Dunia
sumber
0

Saya kira itu karena lebih Pythonic tapi apa yang saya tahu? ;)

Saya tidak berpikir itu penting. Lebih mudah untuk mengingat bagi saya karena tidak perlu menghafal keduanya.

EDIT: PEP mungkin berkata, Anda bisa menyelidiki di sana.

XiKuuKy
sumber
Terima kasih! Faktanya, PEP mengatakan! Lihat PEP-255 untuk pro / kontra dan keputusan akhir tentang kata kunci baru untuk generator.
Derek Kwok
Dengan makna Pythonic: "Cara itu dilakukan dengan Python"?
Giorgio