Qo`shimcha-1: xususiyatlar (properties) faqatgina yangi uslubdagi klasslar uchun ishlaydi (pyhton3 da barcha klasslar shnday klasslardir).
Qo`shimcha-2:Amaliy funksionallik bilan bog`liq bo`lgan chetki kutilmagan holatlardan qutulishga harakat qiling; umuman olganda keshlash kabi ba`zi holatlarning zarari yo`q.
Qo`shimcha-3:Hisoblash ishlariga ko`p vaqt sarflaydigan amallardan imkon qadar ozroq foydalaning, chunki, atributlar yordamida yozilayotganligi sababli murojaat (nisbatan) tez bajarilayotgandek tassurot qoldirishi mumkin.
Agar zis klassingizni boshqa klasslar undan meroslashini, lekin klass ostilar ba`zi atributlarni meroslamasliklarini istab loyihalashtirayotgan bo`lsangiz, nomlarning boshlanishida ikkita tagchiziq qo`shing va oxirida birorta ham tagchiziq qo`ymang. Pythondagi nomlarni o`zgartirish mexanizmi shunday ishlaydiki, klass nomi xuddi shunday atribut nomiga qo`shiladi va bu esa klass ostilarning atributlari bilan bir xil nom bo`lishining oldini olishga asos bo`ladi.
Qo`shimcha-1: E`tiborli bo`ling, agar klass osti xuddi shunday nom va atribut nomiga ega bo`lib qolsa, yana nomlar bir xilligi (nomlar konflikti) kelib chiqishi mumkin.
Qo`shimcha-2:Nomlarni o`zgartirish mexanizmi __getattr__() ni sozlash yoki u bilan ishlashni qiyinlashtirishi mumkin, lekin u juda yaxshi hujjatlashtirilgan hamda qo`lda erkin va samarali boshqarilishi mumkin.
Qo`shimcha-3:Ushbu mexanizm hammaga ham yoqavermaydi, shuning uchun nomlar bir xilligidan qutulish va bu atributlarga murojaat qilish imkoniyatiga ega bo`lish orasida kompromissga erishishga harakat qiling.
Kod shunday yozilishi kerakki, tilning turli lahjalarida ham (PyPy, jython, IronPython, Pyrex, Psyco va boshqalar) bexato ishlashi kerak.
Masalan, CPythonda a+=b yoki a=a+b kabi satrlar konkatenatsiyasining samarali qo`llanilishini kutmang. Bunday buyruqlar Jythonda nisbatan sekinroq bajariladi. Vaqt masalasi juda muhim bo`lgan holatlar uchun, yaxshisi, ‘’.join() dan foydalaning – natijada satrlarni ulash amali Python realizatsiyasidan qat`iy nazar bir xil vaqt davomida bajariladi.
None bilan tekshirish = taqqoslash operatori yordamida emas, balki, albatta is yoki is not lardan biri yordamida amalga oshirilishi kerak. Bundan tashqari, agar if x is not None ni nazarda tutayotgan bo`lsangiz, if x deb yozmang. Masalan, testlash davomida bunday o`zgaruvchi None dan farqli bo`lgan boshqa tipni qabul qilishi ham mumkin, lekin tiplashtirish davomida esa False hozil bo`lishi mumkin!
Solishtirish metodlaridan foydalanayotganda boshqa dasturchilar faqatgina aynan bir solishtirish operatsiyalarini qo`llashlariga umid qilishdan ko`ra, solishtirishning barcha 6 ta operatsiyalaridan (__eq__, __ne__, __lt__, __le__, __gt__, __ge__) foydalanish kerak.
Ishni osonlashtirish maqsadida functools.total_ordering() dekoratoridan yetishmayotgan metodlarni qo`llash uchun foydalanish mumkin.
PEP207 interpretator y > x ni x < y ga, y >=x ni x <= y ga almashtirishi hamda x == y va x != y larning argumantlarini o`rin almashtirishi mumkinligini ko`rsatadi. sort() va min() funksiyalari < belgisidan, max() esa > belgisidan foydalanishi kafolatlanadi. Lekin, boshqa holatlarda tusunmovchiliklarning oldini olish maqsadida barcha 6 ta operatsiyalardan foydalanish tavsiya etiladi.
Lyambda-iborani nomga o`zlashtirish o`rniga har doim def iborasini qo`llang.
To`g`ri qo`llanilishi:
def f(x): return 2*x
Xato qo`llanilishi:
f = lambda x: 2*x
Shaxsiy noodatiy holat klassingizni BaseException dan emas, Exception dan meroslang.BaseExceptiondan to`g`ridan-to`g`ri meroslash amali qamrab olish kerak bo`lmagan noodatiy holatlar uchun zahiralab qo`yilgan.
Noodatiy holatlar zanjirini kerakli tarzda qo`llang. Python 3 da “raise X from Y”dan sozlash axborotini yo`qotmasdan yaqqol almashtirish uchun foydalanish kerak.
Noodatiy holat qasddan almashtirilayotganda (Python2 da “raise X” ni qo`llash yoki “raise X from None” Python 3.3+ da), kerakli ma`lumot yangi noodatiy holatga uzatilganligini nazorat qiling(KeyErrorning AttributeErrorga aylanishi davomida atribut nomining saqlanishi yoki dastlabki noodatiy holat matnining yangisiga joylashtirilishi kabi ).
Bundan tashqari siz noodatiy holat yaratayotganingizda eski sintaksis bo`lgan raise ValueError, message o`rniga raise ValueError(‘message’) ko`rinishida yozing.
Python 3 da eskicha yozish shakli ta`qiqlangan.
Bundau shaklda qo`llash ma`qulroq, chunki, qavslar sababli ko`chiriladigan satrlar belgilaridan agar ular juda uzun bo`lsa yoki formatlash qo`llanilgan bo`lsa foydalanish shart emas.
Kodingiz noodatiy holatlarni aniqlab olganda umumiy except iborasining o`tniga aniq xatoliklarni aniqlang va qayta ishlang:
Masalan, mana bunday yozing:
try:
import platform_specific_module
except ImportError:
platform_specific_module = None
Oddiygina ‘except:’ ning o`zini yozishimiz SystemExit ni ham, KeyboardInterrupt aniqlab, qayta ishlashiga va bu esa, o`z navbatida yangi muammolarni, masalan, Ctrl+C kombinatsiyasi yordamida dastur ishini yakunlashning murakkablashuvini keltirib chiqaradi. Agar siz chindan ham barcha noodatiy holatlarni aniqlash va qayta ishlashni istasangiz, “except Exception:” ko`rinishida yozing.
“except:” dan foydalanishni quyidagi ikki holatdan tashqari cheklash yaxshi amaliyotdir:
Qayta ishlash jarayonida foydalanuvchiga sodir bo`lgan xatolik haqidagi barcha ma`lumotlar chiqarib ko`rsatilsa, foydalanuvchi, hech bo`lmaganda, xatolik sodir bo`lganini bilib oladi.
Noodatiy holatni aniqlangandan keyin qandaydir kodni bajarish va undan keyin uni yana qayta ishlash uchun boshqa biror joyda qo`llash kerak bo`lganda. Aslida esa, odatda “try … finally” konstruksiyasidan foydalanish qulayroq va to`g`riroqdir.
try:
process_data()
except Exception as exc:
raise DataProcessingFailedError(str(exc))
Aniqlangan noodatiy holatlarning aniq nom bilan bog`liq holatlar uchun Python 2.6 dan qo`shilgan bog`liqlikning aniq sintaksisidan foydalaning.
Bu Python 3 da qo`llaniladigan va verguldan foydalanishga asoslangan eski sintaksis bilan bog`liq muammolarning kelib chiqmasligiga imknon beruvchi yagona sintaksisdir.
Operatsion sistemaning xatoliklarini aniqlab, qayta ishlanayotganda errno qiymatlar tahlilining o`rniga Python 3.3 dan kiritilgan noodatiy holatlarning aniq iyerarxiyasidan foydalaning.
Har bir try … except konstruksiyasining tarkibiga xatoliklarni samaraliroq aniqlash va qayta ishlash maqsadida imkon qadar ozroq kod yozishga intiling. Shu bilan birga bu yashirin xatoliklarning oldini olishga ham yordam beradi.
To`g`ri qo`llanilishi:
try:
value = collection[key]
except KeyError:
return key_not_found(key)
else:
return handle_value(value)
Xato qo`llanilishi:
try:
# Bu yerda amallar ko`p!
return handle_value(collection[key])
except KeyError:
# Bu yerda handle_value() tomonidan yuzaga keltirilishi mumkin bo`lgan
→KeyError ham aniqlanadi va qayta ishlanadi
return key_not_found(key)
Manba lokal bo`lgan holatlar uchun kodning ma`lum qismida bajarilganidan keyin u ishonchli tarzda tozalanishi uchun with iborasini qo`llang.
Kontekst menedjerlarini resurslarga ega bo`lish yoki ularni bo`shatishdan tashqari har qanday holatda alohida funksiya yoki metod vositasida qo`llash tavsiya etiladi.
To`g`ri qo`llanilishi:
with conn.begin_transaction():
do_stuff_in_transaction(conn)
Xato qo`llanilishi:
with conn:
do_stuff_in_transaction(conn)
Yuqoridagi misolimiz __enter__ va __exit__ transaksiyadan keyin ulanishni yopishdan tashqari biror bir vazifani bajarayotganligi haqida hech qanday ma`lumot bermaydi. Bu holatda aniqroq bo`lish muhimdir.
string modulining o`rniga satrlar metodlarini qo`llang – ular hamisha tezkorroq va unicod-satrlar uchun aynan bir xil APIga ega. Ushbu qoidalardan agar Python 2.0 dan kichikroq versiyalar bilan mutanosiblikni ta`minlash maqsadlarida voz kechish mumkin.
Python 3 da faqat satrlar metodlari qolgan.
Suffikslar va prefikslarni tekshirishda satrlar kesimlarini qayta ishlashdan ko`ra, ‘’.startswith() va ‘’.endswith() larni qo`llang.
‘’.startswith() va ‘’.endswith() lar nisbatan tartibli ko`rinadi hamda ozroq xatoliklarni keltirib chiqaradi. Masalan:
To`g`ri qo`llanilishi:
if foo.startswith('bar'):
Xato qo`llanilishi:
if foo[:3] == 'bar':
Ob`yektlar tiplarini solishtirish amalini to`g`ridan-to`g`ri solishtirish orqali emas, isinstance() yordamida bajarish kerak.
To`g`ri qo`llanilishi:
if isinstance(obj, int):
Xato qo`llanilishi:
if type(obj) is type(1):
Ob`yektning satr ekanligini takshirayotganingizda, satr unicod-satr ham bo`lishi mumkinligini inobatga oling. Python 2 da str va unicode da umumiy bazaviy klassi mavjud, shuning uchun siz quyidagicha yozishingiz mumkin:
if isinstance(obj, basestring):
Python 3 da unicode va basestringlar mavjud emasligini ta`kidlab o`tish kerak(faqatgina str bor) hamda bytes endi satr emas balki butun sonlar ketma-ketligidir.
Ketma-ketliklar (satrlar, ro`yxatlar va kortejlar) uchun bo`sh ketma-ketlik false ekanligidan foydalaning:
To`g`ri qo`llanilishi:
if not seq:
if seq:
Xato qo`llanilishi:
if len(seq)
if not len(seq)
Oxirida muhim bo`lgan bo`sh joylarga ega satrli o`zgarmaslardan foydalanmang, chunki bu bo`sh joylar ko`rinmaydi, ko`pchilik muharrir dasturlari esa, ularni kesib yashlaydi.
True va False li mantiqiy tiplarni == yordamida solishtirmang:
To`g`ri qo`llanilishi:
if greeting:
Xato qo`llanilishi:
if greeting == True:
Umuman xato qo`llanilishi:
if greeting is True:
26-bob
Dostları ilə paylaş: |