1. Python tili imkoniyatlari Pythonni ko`chirish



Yüklə 2,19 Mb.
səhifə52/78
tarix19.12.2023
ölçüsü2,19 Mb.
#152124
1   ...   48   49   50   51   52   53   54   55   ...   78
1. Python tili imkoniyatlari Pythonni ko`chirish

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.

Umumiy tavsiyalar


  • 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:

  1. 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.

  2. 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


Yüklə 2,19 Mb.

Dostları ilə paylaş:
1   ...   48   49   50   51   52   53   54   55   ...   78




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©genderi.org 2024
rəhbərliyinə müraciət

    Ana səhifə