Tidak banyak yang mengetahui fitur ini, tetapi fungsi (dan metode) Python dapat memiliki atribut . Melihat:
>>> def foo(x):
... pass
...
>>> foo.score = 10
>>> dir(foo)
['__call__', '__class__', '__delattr__', '__dict__', '__doc__', '__get__', '__getattribute__', '__hash__', '__init__', '__module__', '__name__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', 'func_closure', 'func_code', 'func_defaults', 'func_dict', 'func_doc', 'func_globals', 'func_name', 'score']
>>> foo.score
10
>>> foo.score += 1
>>> foo.score
11
Apa kegunaan dan penyalahgunaan yang mungkin dari fitur ini di Python? Satu kegunaan yang baik yang saya ketahui adalah penggunaan dokumen oleh PLY untuk mengaitkan aturan sintaksis dengan suatu metode. Tetapi bagaimana dengan atribut khusus? Apakah ada alasan bagus untuk menggunakannya?
python
function
attributes
Eli Bendersky
sumber
sumber
Jawaban:
Saya biasanya menggunakan atribut fungsi sebagai penyimpanan untuk anotasi. Misalkan saya ingin menulis, dengan gaya C # (menunjukkan bahwa metode tertentu harus menjadi bagian dari antarmuka layanan web)
maka saya bisa mendefinisikan
Kemudian, ketika panggilan layanan web tiba, saya mencari metode, memeriksa apakah fungsi yang mendasari memiliki atribut is_webmethod (nilai sebenarnya tidak relevan), dan menolak layanan jika metode tersebut tidak ada atau tidak dimaksudkan untuk dipanggil melalui web.
sumber
.__doc__
Saya telah menggunakannya sebagai variabel statis untuk suatu fungsi. Misalnya, diberi kode C berikut:
Saya dapat mengimplementasikan fungsi serupa di Python:
Ini pasti akan jatuh ke ujung "penyalahgunaan" spektrum.
sumber
Anda dapat melakukan objek dengan cara JavaScript ... Tidak masuk akal tetapi berfungsi;)
sumber
def test()
benar-benar diperlukan?Saya menggunakannya dengan hemat, tetapi mereka bisa sangat nyaman:
Sekarang saya dapat menggunakan
log
seluruh modul saya, dan mengarahkan ulang output hanya dengan mengaturlog.logfile
. Ada banyak dan banyak cara lain untuk mencapai itu, tetapi yang ini ringan dan sederhana. Dan walaupun baunya lucu ketika pertama kali melakukannya, saya mulai percaya bahwa baunya lebih enak daripada memilikilogfile
variabel global .sumber
Atribut fungsi dapat digunakan untuk menulis penutupan ringan yang membungkus kode dan data terkait:
1,00934004784
2.00644397736
3.01593494415
sumber
time.sleep(1)
lebih baik daripadaos.system('sleep 1')
Saya telah membuat dekorator pembantu ini untuk dengan mudah mengatur atribut fungsi:
Use case adalah untuk membuat kumpulan pabrik dan menanyakan tipe data yang dapat mereka buat pada tingkat meta fungsi.
Misalnya (sangat bodoh):
sumber
factory1.datatype=list
tepat di bawah deklarasi seperti dekorator gaya lama?items()
sebagai gantiiteritems()
.Terkadang saya menggunakan atribut fungsi untuk caching nilai yang sudah dihitung. Anda juga dapat memiliki dekorator generik yang menggeneralisasikan pendekatan ini. Waspadai masalah konkurensi dan efek samping dari fungsi-fungsi tersebut!
sumber
Saya selalu berasumsi bahwa satu-satunya alasan ini mungkin adalah karena itu ada tempat yang logis untuk meletakkan doc-string atau hal-hal semacam itu. Saya tahu jika saya menggunakannya untuk kode produksi apa pun itu akan membingungkan kebanyakan orang yang membacanya.
sumber