1-sahifa 2-sahifa
Download 363.98 Kb.
|
Python
- Bu sahifa navigatsiya:
- 23.6. Istisnolarni tashlab yuborish
- 229-bet 23.7. Istisno qadoqlash 229
- 231-bet 23.7. Istisno qadoqlash 231
- 232-sahifa 232
- 233-bet 23.9. Xulosa 233
- 235-bet 24 Import kutubxonalar
- 237-bet 24.1. Import usullari 237
- 239-bet 24.2. Import qilishda nomuvofiqliklar 239 24.2. Import qilishda nomuvofiqliklar
- 241-sahifa 24.5. Importni tashkil qilish 241 24.4. Ichki kutubxonalar
228 23-bob. Istisnolar def nsmallest (n, iterable, key = Yo'q): # ....
# Agar n> = hajmi bo'lsa, tartiblangan () ni ishlatish uchun tezroq urinib ko'ring: hajmi = len (iterable) tashqari (TypeError, AttributeError) e sifatida: o'tish yana:
agar n> = hajmi: Qaytish tartiblangan (iterable, key = key) [: n] # Kodning bir qismi o'tkazib yuborilgan .... Sekinroq yo'ldan foydalaning
Istisno holatlardan tashqari, Python ham qo'lga olish qobiliyatini beradi kodga istisnolarni tashlang (masalan, ularni boshlang). Shuni unutmang Zen Python sizning niyatlaringizni va kurashishingizni ifoda etishni tavsiya qiladi biron bir narsani taklif qilish vasvasasi bilan. Agar funktsiya noto'g'ri berilgan bo'lsa, kiriting va siz buni bajara olmasligingizni bilasiz, berishingiz mumkin istisno. Istisnolar bu BaseException sinfining quyi sinflari , va ularni chiqarish uchun oshirish buyrug'idan foydalaning : BaseException-ni ko'tarish ('dastur amalga oshmadi') Odatda, dastur umumiy bo'lmagan sinf sinfini yaratadi BaseException va uning subklasslaridan birining istisnosi tayyor yoki ishlab chiqaruvchi tomonidan belgilanadi. Boshqa keng tarqalgan timsolda Ko'tarish buyrug'i o'z-o'zidan ishlatiladi. Eslatib o'tamiz, jamoa ichida tashqari faol deb ataladigan istisno mavjud. Unday bo `lsa minimal oshirish buyrug'i bilan qilishingiz mumkin . Bu buyruq ruxsat beradi istisnolarni ishlating va keyin yana asl istisnoni tashlang. Kodni bajarishga urinayotganda tashqari (TypeError, AttributeError) e sifatida: log ('Istisno tugatish') ko'tarish e Siz asl istisnoni muvaffaqiyatli tashlashingiz mumkin, ammo iz qoziq stack dastlabki istisno endi sodir bo'lganligini ko'rsatadi birinchi ekranda emas, balki ko'tarish buyrug'i bilan satrda . U-
23.7. Istisno qadoqlash 229 Ikki echim mavjud. Birinchisi, minimal buyruqdan foydalanish oshirilishini . Ikkinchisi - bog'langan istisnolardan foydalanish (pastga qarang). Keling, standart kutubxonaning configparser modulidan misolni ko'rib chiqaylik . Ushbu modul INI fayllarini o'qish va yaratishni ta'minlaydi. Ini fayllar odatda sozlash uchun ishlatiladi; Ular bo'lgan JSON va YAML formatlarining paydo bo'lishiga qadar mashhur. .Diqqat qilish usuli lug'atdan konfiguratsiyani o'qishga harakat qilmoqda. Agar misol bittasini qo'shmoqchi bo'lganingizda "qattiq" rejimga o'tadi bo'limlar bir necha marta tashlanadi. Agar "qiyin" bo'lsa rejim yoqilmagan, usul takroriy kalitlarga ruxsat beradi; is- oxirgi kalitdan foydalanadi. Variantni namoyish etadigan usulning bir qismi minimal oshirish buyrug'i bilan : def read_dict (o'z-o'zidan, lug'at, manba = ' elementlar_added = o'rnatish () bo'lim uchun, dictionary.items () tugmachalari: bo'lim = str (bo'lim) urinib ko'ring: self.add_section (bo'lim) tashqari (DuplicateSectionError, ValueError): agar self._strict_ va element_added qismida bo'lim: oshirish
elementlar_added.add (bo'lim) Kodning bir qismi yo'q .... Agar dublikat qattiq rejimda qo'shilsa, stack izi hali ham saqlanib qoladi .add_section usulida xatolik yuz berdi, chunki u shu erda yuz berdi. 23.7. Istisno qadoqlash Python 3 minimal buyruqqa o'xshash yangi funktsiyani taqdim etadi doy oshirish ; u PEP 3134-da tasvirlangan - Istisno zanjir va ko'milgan Tracebacks ". Ishlov berish kodidagi istisno bilan ishlaganda, bu mumkin yana bir istisno tashla. Bunday vaziyatlarda bilish foydali bo'ladi ikkala istisnolar haqida. Quyida namunaviy kod keltirilgan. Divide_work funktsiyasi bo'lishi mumkin 0 ga bo'lish bilan bog'liq muammolar. Siz ushbu xatoni ko'rishingiz va ro'yxatdan o'tishingiz mumkin uni jurnalga yopishtiring. Aytaylik, ro'yxatga olish funktsiyasi teskari bo'ladi -
230 23-bob. Istisnolar hozirda mavjud bo'lmagan bulut xizmatiga Ushbu vaziyatni taqlid qilish uchun biz logni istisno qilamiz): >>> def log (msg): ... SystemError-ni ko'taring ("Ro'yxatdan o'tmaslik") >>> def divide_work (x, y): ... harakat qilib ko'ring: ... x / y ga qaytish ZeroDivisionError-dan tashqari: ...
log ("tizim ishlamayapti") Agar siz divide_work- ni chaqirishda 5 va 0-dan o'tsangiz , Python ma'lumotlarni chop etadi taxminan ikkita xato, ZeroDivisionError va SystemError . SystemError xatosi oxirgi marta chiqadi, chunki bu oxirgi marta sodir bo'ldi: >>> divide_work (5, 0) Traceback (eng so'nggi qo'ng'iroq oxirgi): Fayl "begpy.py", 3-qator, divide_work-da x / y ga qaytish ZeroDivisionError: nolga bo'lish Yuqoridagi istisnolarni ko'rib chiqishda yana bir istisno ro'y berdi: Traceback (eng so'nggi qo'ng'iroq oxirgi): Fayl "begpy.py", 1-qator, divide_work (5, 0) Fayl "begpy.py", 5-qator, divide_work-da log ("tizim ishlamayapti") "Begpy.py" fayli, 2-qator, jurnalga SystemError-ni ko'tarish ("Ro'yxatdan o'tmaslik") SystemError: Ro'yxatdan o'tilmadi Aytaylik, bulutli log xizmati ishlamoqda ( jurnal funktsiyasi allaqachon mavjud) xato bermaydi). Agar siz ZeroDivisionError turini o'zgartirishni xohlasangiz yilda divide_work bir kuni ArithmeticError , tasvirlangan sintaksisi foydalanish Buni amalga oshirish uchun ... sintaksisini ko'tarish ... dan foydalaning : >>> def log (msg): ... bosib chiqarish (msg) >>> def divide_work (x, y): ... harakat qilib ko'ring: ... x / y ga qaytish
23.7. Istisno qadoqlash 231 ZeroDivisionError-dan tashqari: ... log ("tizim ishlamayapti") ... ArithmeticError () ni ex-dan oshirish Endi siz ikkita istisnoni ko'rasiz: asl ZeroDivisionError va An ArithmeticError gap endi tomonidan yashirin ZeroDivisionError : >>> divide_work (3, 0) Traceback (eng so'nggi qo'ng'iroq oxirgi): Fayl "begpy.py", 3-qator, divide_work-da x / y ga qaytish ZeroDivisionError: nolga bo'lish Yuqoridagi istisnolarni ko'rib chiqish paytida yana bir narsa yuz berdi istisno: Traceback (eng so'nggi qo'ng'iroq oxirgi): Fayl "begpy.py", 1-qator, divide_work (3, 0) Fayl "begpy.py", 6-qator, divide_work-da ArithmeticError () ni ex-dan oshirish Arifmetikrror Agar asl istisno ZeroDivisionError-ni bostirmoqchi bo'lsangiz , ishlatilgan quyidagi koddan foydalaning (qarang "PEP 0409 - istisnolarni bostirish" kontekst "): >>> def divide_work (x, y): ... harakat qilib ko'ring: ... x / y ga qaytish ZeroDivisionError-dan tashqari: ...
log ("tizim ishlamayapti") ...
ArithmeticError () ni None dan ko'taring Endi faqat tashqi ArithmeticError xatosi ko'rinadi : >>> divide_work (3, 0) Traceback (eng so'nggi qo'ng'iroq oxirgi): Fayl "begpy.py", 1-qator, divide_work (3, 0) Fayl "begpy.py", 6-qator, divide_work-da ArithmeticError () ni None dan ko'taring Arifmetikrror
232 23-bob. Istisnolar 23.8. O'zingizni aniqlash istisnolar Istisnolar moduli ko'plab o'rnatilgan istisnolarni belgilaydi. Agar sizning xatoingiz ba'zi mavjud istisnolarga yaxshi mos keladi. niy, foydalaning. Quyida o'rnatilgan sinflarning ierarxiyasi keltirilgan. istisnolar: Asos
Systemexit KlaviaturaInterrupt GeneratorExit Istisno
StopIteration Arifmetikrror FloatingPointError OverflowError ZeroDivisionError Tasdiqlash xatosi AttributeError Bufererror EnvironmentError IOError
OSError Eoferror
Importyor Xato
Indexerror Keyerror
Memoryerror NameError UnboundLocalError ReferatError Runtimeerrror NotImplementedError Sintakserrror IndentationError Taberror Systemerrror TypeError ValueError UnicodeError UnicodeDecodeError
23.9. Xulosa 233 UnicodeEncodeError UnicodeTranslateError Ogohlantirish Eskirish Ogohlantirish KutishDepratatsiya Ogohlantirish O'tkazib yuborish Sintaktik ogohlantirish FoydalanuvchiWarning Futurewarning ImportWarning UnicodeWarning Baytiy ogohlantirish O'zingizning istisnolaringizni aniqlash uchun sinfning kichik sinfini tanlang Istisno yoki uning kichik sinflaridan biri. Gap shundaki, hamma boshqalar BaseException kichik sinflari "istisnolar" shart emas. Masalan, agar siz Klaviaturani kessangiz , muvaffaqiyatsiz bo'ladi Ctrl + C tugallanadigan jarayonni tugatish . Agar siz ushlasangiz GeneratorExit , generatorlar ishlashni to'xtatadi. Bu erda ma'lumot etishmasligi uchun istisno qanday ko'rinishga ega dasturda: >>> sinf DataError (Istisno): ... def __init __ (o'zini, yo'qolgan): ...
self.missing = yo'qolgan Nostandart istisnolardan foydalanish juda oddiy: >>> agar konfiguratsiya qilinmagan bo'lsa 'muhim_data': ... DataError-ni oshiring ('muhim_data yo'q') 23.9. Xulosa Ushbu bobda istisno bilan ishlash strategiyalari keltirilgan. LBYL strategiyasida, operatsiyani amalga oshirishdan oldin, siz buni tasdiqlaysiz hozirgi vaziyatda hech qanday xato bo'lmaydi. EAFP strategiyasida barcha kodlar mavjud xato sinash / tutish blokida bo'lishi mumkin . Pitonda dasturlashning ikkinchi uslubiga ustunlik beriladi. Xatolarni aniqlashning turli mexanizmlari ham ko'rib chiqildi. berish va qayta berish. Bo'lim oxirida bu qanday amalga oshirilganligi ko'rsatildi
234 23-bob. Istisnolar o'zingizning yaratish uchun subclass mavjud istisnolar istisnolar. 10/23. Mashqlar 1. Oddiy kalor funktsiyalarini bajaradigan dastur yozing sovutgich. Dastur ikkita raqamni oladi va keyin so'rov yuboradi radiator. To'g'ri kiritilmagan ishlov berishni tekshiring sonlarga rivojlanadi. Nol xatolar bilan ishlov berish. 2. Chiziqqa oldin raqamlashni kiritadigan dastur yozing. mi fayl. Fayl nomi buyruq satridagi dasturga uzatiladi. Sys modulini import qiling va sys ro'yxatidan fayl nomini o'qing . argv . O'tkazib yuborish imkoniyatini to'g'ri hal qiling fayl.
24 Import kutubxonalar Oldingi boblarda asosiy til tuzilmalari ko'rib chiqilgan. Python Ushbu bobda kodni import qilish haqida. Ko'p tillarda
qayta ishlatmoq. Python katta tanlov bilan birga keladi kutubxonalar, ammo, bu kutubxonalar foyda olish uchun, siz kerak ulardan foydalana olish. Kutubxonadan foydalanish uchun kodni kutubxonadan yuklab olishingiz kerak ichiga ning ism sizning dasturi. Ismlar maydoni o'z ichiga oladi dastur uchun mavjud bo'lgan funktsiyalar, sinflar va o'zgaruvchilar. Agar xoxlasangiz Burchakning sinusini hisoblash uchun siz funktsiyani aniqlab olishingiz kerak ushbu hisob-kitoblarni bajaradi yoki tayyor funktsiyani yuklaydi. O'rnatilgan ennaya kutubxona matematikasida sin uchun sin funktsiyasi mavjud radian bilan ifodalangan burchak. Kutubxonada shuningdek o'zgaruvchan, "pi" ning aniqlash qiymati: >>> matematikani sinishdan, pi >>> gunoh (pi / 2) 1.0 Yuqoridagi parcha matematik modulni yuklaydi . Biroq, u bunday qilmadi Matematikani sizning nomingiz ostiga itarib yuboradi. Buning o'rniga u o'zgaruvchini yaratadi, bu matematik moduldan olingan gunoh funktsiyasiga ishora qiladi . U ham yaratadi matematik moduldan pi o'zgaruvchisiga ishora qiluvchi o'zgaruvchi . Agar Siz
236 24-bob. Kutubxonalarni import qilish dir funktsiyasidan foydalanib, hozirgi nomlar maydonini tahlil qiling , Siz buni tasdiqlashingiz mumkin: >>> "gunoh" dir () Rost
24.1. Import usullari Oldingi misolda biz biblidan bitta funktsiyani import qildik teki. Bundan tashqari, kutubxonani nomlar oralig'iga va Barcha sinflarga, funktsiyalarga va parametrlarga ulaning. Import qilish uchun matematik modul ismlar maydonida quyidagi buyruqni kiriting: >>> import matematikasi Ushbu misol matematik kutubxonani import qiladi . Bu yaratadi modulga ishora qiluvchi yangi matematik o'zgaruvchilar . Ushbu modul o'z ichiga oladi Dir funktsiyasi bilan namoyish qilinishi mumkin bo'lgan turli xil atributlar : >>> dir (matematik) ['__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ship', 'copysign', 'cos', 'cosh', 'darajalar', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'gipot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh, trunc'] Ushbu atributlarning ko'pi funktsiyalardir. Agar xoxlasangiz- tan funktsiyasini chaqiring , bu muvaffaqiyat qozonmaydi, chunki tan nomi kiritilmagan sizning ismingiz bo'sh joyiga faqat matematik . Ammo sarflashingiz mumkin nuqta operatori ( . ) yordamida matematik o'zgaruvchini qidirish . Bu operator ob'ektning xususiyatlarini tekshiradi. Pythonda hech narsa yo'q ob'ektlardan tashqari, ushbu operatordan qidirish uchun foydalanishingiz mumkin matematik ob'ektning tan atributi : >>> matematikadan (0) 0,0
24.1. Import usullari 237 Kutubxonalarni import qilish import matematikasi ...
tan gunoh
Id: 1aea matematik Id: 1ca8 __class __: funktsiyasi __-sinf __: modul Id: 1ca8
Kod Kompyuter nima qiladi O'zgaruvchilar Ob'ektlar __class __: funktsiyasi
modulga ishora qiluvchi matematik o'zgaruvchi. Modul har xil davr yordamida foydalana oladigan atributlar Agar siz tan vazifasini bajarish uchun hujjatlarni o'qishni istasangiz , foydalaning yordam funktsiyasidan foydalaning : >>> yordam (matematik dastur) Matematik modulda tanlangan funksiya uchun yordam: tan (...) tan (x) Tangens x ni qaytaradi (radian shaklida).
238 24-bob. Kutubxonalarni import qilish MASLAHAT Qachon yordamida funktsiyani import qilish bo'yicha qachon va import buyrug'ini olish kerakmi? Agar bibliyadan atigi ikkita atributdan foydalansangiz shishish, dan import uslubi mexanizmidan foydalaning . Qurilishda dan vergul bilan ajratilgan bir nechta atributlarni sanab o'tish mumkin: >>> matematikadan sin, cos, tan >>> cos (0) 1.0
Ammo kutubxonaning ko'p qismiga kirish kerak bo'lsa, bu osonroq bo'ladi import buyrug'i bilan kutubxonani import qiling . Bunday echim ham aytib beradi sizning kodingizni o'qigan har bir kishiga (shu qatorda siz ham), u qaerdan yoki qayerdan kelgan funktsiya (sinf, o'zgaruvchan). ESLATMA Agar siz kutubxonadan bir nechta atributlarni import qilishingiz kerak bo'lsa, buyruq bir nechta satrlarni olishi mumkin. Agar siz importni davom ettirishga harakat qilsangiz Keyingi satrda vazifani bajarishda xato yuzaga keladi: >>> matematik import gunohidan, ... cos
Traceback (eng so'nggi qo'ng'iroq oxirgi): Fayl " SyntaxError: oxirida vergul qo'yib bo'lmaydi atrofdagi qavslarsiz Buyruq keyingi satrda davom etishini ko'rsatish uchun qo'ying belgi \ : >>> matematik import gunohidan, \ ... cos
Boshqa variant ham mumkin - import qilingan nomlarni aylanada ro'yxatlash. Qavslar. Qavsni ochish (kvadrat yoki jingalak) buyruq quyidagi satrda davom etishini bildiradi. >>> matematikadan (sin, ... cos) Ikkinchi shakl Python uchun ko'proq idiomatik hisoblanadi.
24.2. Import qilishda nomuvofiqliklar 239 24.2. Import qilishda nomuvofiqliklar Agar siz trigonometrik dastur ustida ishlayotgan bo'lsangiz operatsiyalarida siz allaqachon gunoh deb nomlangan funktsiyaga ega bo'lishingiz mumkin . Agar Matematik kutubxonadan gunoh funktsiyasidan foydalanmoqchimisiz ? Bitta mumkin bo'lgan echimlar - import matematikasi ; keyin math.sin kirish kutubxona versiyasini anglatadi va gunoh sizning vazifangizdir. Python yana bir variantni taqdim etadi. Siz qayta belgilashingiz mumkin Hissa kalit yordamida nomini import bilan : >>> matematik import gunohidan, boshqa_sinlar kabi >>> boshqalar_sin (0) 0,0 Endi other_sin uchun bir bog'laning gunoh versiyasi bo'yicha matematika , va siz foydalanish davom ettirishingiz mumkin gunoh zimmasiga muhtoj holda kodi.
Deb kalit so'z bilan ham ishlaydi import buyruqlar . Agar sizda bo'lsa nomi nomiga zid bo'lgan o'zgaruvchi (yoki funktsiya) sizning nomingiz bo'shligidagi matematikada quyidagi parcha ko'rsatilgan mumkin bo'lgan echimlardan biri: >>> matematik boshqa_math kabi import qilish >>> boshqa_math.sin (0) 0,0
Kalit so'z sifatida kodni yanada ixcham qilishga yordam beradi. Agar sizning sevimli kutubxonangiz juda uzun nomlardan foydalanadi, siz ularni sizning kodingizda osongina qisqartirishi mumkin. Numpy Library 1 foydalanuvchilari ikkita harfning standart qisqartmasi sifatida qabul qilindi: >>> np sifatida import Shunga o'xshash standart Pandas 2 kutubxonasida qabul qilingan : >>> pandalarni pd sifatida import qilish 1 numpy.org 2 pandas.pydata.org
240 24-bob. Kutubxonalarni import qilish 24.3. Ommaviy import Python shuningdek, nomlar maydonini chalkashtirishga imkon beradi Tomonidan ommaviy import : >>> matematikadan * >>> asin (0) 0,0
Ushbu kod aniqlanmagan artsin funktsiyasini chaqiradi kodda. Asin deb ataladigan satr birinchisini o'z ichiga oladi koddagi asinni bilish . Nima sodir bo `LDI? Matematik buyruqdan foydalanganda import * , bu buyruq Python-ga barcha tarkibni yuklashini aytadi matematik kutubxonalar (sinf ta'riflari, funktsiyalar va o'zgaruvchilar) in Mahalliy nomlar maydoni. Garchi bunday imkoniyat bir qarashda Bu qulay ko'rinadi, aslida bu juda xavflidir. Ommaviy import nosozliklarni tuzatishni murakkablashtiradi, chunki u yo'q Bu yoki boshqa kod qaerdan kelganligi aniq ko'rsatib turibdi. Bundan ham ko'proq muammolar ko'p kutubxonalardan ommaviy import qilingan niklar. Ko'proq keyinchalik import buyruqlari shunga o'xshash narsalarni bekor qilishi mumkin oldingi kutubxonada nima aniqlangan. Shu sabab bilan, ommaviy import qilish tavsiya etilmaydi.
Ommaviy importdan foydalanmang! Ushbu qoidadan mumkin bo'lgan istisnolar faqat qachon bajariladi test kodini yozish yoki REPL bilan tajriba o'tkazish orqali. Kutubxona mualliflari ushbu konstruktsiyadan hamma narsani import qilishda foydalanadilar ular sinab ko'rmoqchi bo'lgan kutubxonaning tarkibi. Yo'q ommaviy ko'rganingizdan shunchaki ko'rganingiz uchun foydalaning birovning kodida. Zen Pythonni eslab qoling: "Aniqlik oshkor bo'lgandan yaxshiroqdir."
24.5. Importni tashkil qilish 241 24.4. Ichki kutubxonalar Ba'zi Python paketlarida ichki o'rnatilgan nomlar mavjud. Masalan chora-tadbirlar, Python-ga kiritilgan XML kutubxonasi qo'llab-quvvatlashni o'z ichiga oladi minidom va etree . Ikkala kutubxona ham ota-ona ichida joylashgan xml to'plami : >>> xml.dom.minidom importidan \ ... parseString >>> dom = parseString ( ... ' >>> xml.etree.ElementTree import-dan \ ... XML >>> elem = XML (' Dan tuzilishga faqat kerakli funksiyalarni import qilish imkonini beradi. va sinflar. Import konstruktsiyasi ( dan tashqari ) kod miqdorini oshiradi (lekin) shuningdek paketning to'liq tarkibiga kirish huquqini ochadi): >>> xml.dom.minidom-ni import qilish >>> dom = xml.dom.minidom.parseString ( ... ' >>> xml.etree.ElementTree-ni import qilish >>> elem = xml.etree.ElementTree.XML ( ... ' Download 363.98 Kb. Do'stlaringiz bilan baham: |
ma'muriyatiga murojaat qiling