Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
KL-LAB8(9).doc
Скачиваний:
18
Добавлен:
12.02.2016
Размер:
1.6 Mб
Скачать

2.2 Багатомодульні програми

Деякі програми розробляються для вирішення багатьох різнотипних задач. Наприклад, програма повинна завантажити дані, здійснити їх певну обробку чи аналіз а результати візуалізувати. Якщо вже є готові стабільні модулі для завантаження даних та візуалізаці, то розробка такої програми полягає тільки в створенні тієї її частини, яка здійснює обробку чи аналіз даних та виклику потрібних функцій з існуючих модулів. Рис.1. ілюструє запропонований підхід.

Рис 1. Структура багатомодульної програми: Головна програма my_program.py імпортує функції з двох інших модулів; рішення задачі аналізу здійснюється в головній програмі а загальні задачі завантаження даних та візуалізація вирішуються окремо, що дозволяє їх повторно використовувати та при потребі змінювати.

Розподіл виконання задач між декількома модулями та використання твердження для доступу до функцій дозволяє зберігати індивідуальність та простоту модулів та спрощувати їх обслуговування. Зрозуміло, такий підхід приводить до зростання кількості модулів. При побудові складних систем виникає потреба в побудові певних ієрархій модулів. Належне документування функцій та модулів значно спрощує виконання таких задач.

2.3 Помилки

Майстерність програмування залежить від здобутих навиків по вирішенню різноманітних проблем, які дозволяють встановити чому програма не працює так, як очікувалось. Звичайний помилковий символ в тексті програми може привести до її незрозумілої поведінки. В таких випадках ми говоримо про помилки, вади програми. Помилки найчастіше виявляються тільки вже при запуску програми, часто виправлення одної помики приводить до виникнення іншої. Ні один програміст не гарантований від помилок при розробці програм. Виправлення помилок, зневаджування програм, дуже складна задача,оскільки джерела помилок є дуже різними. Наприклад, джерелами помилок може бути не правильне розуміння вхідних даних, алгоритму роботи програми або мови програмування. Наступні приклади демонструють помилки такого типу.

Вхідні дані можуть містити непередбачені символи. Наприклад, імя синсету в WordNet має наступний вигляд tree.n.01, три частини розділені крапкою. МодульNLTK WordNet спочатку здійснює декомпозицію цього імені, використовуючиsplit('.'). Зрозуміло, цей спосіб приведе до помилки, якщо спробувати переглянути синсет словаPhD, який містить чотири крапки замість очікуваних двох ph.d..n.01 . Рішення цієї проблеми – використання вбудованої функціїrsplit('.', 2) , яка дозволяє вказати, що буде зроблено тільки два розбиття починаючи від молодших розрядів. Цю помилку, незважаючи на тестування, було виявлено вже після публікації модуля(http://code.google.com/p/nltk/issues/detail?id=297).

Неочікувана поведінка функції. Наприклад при тестуванніNLTKінтерфесуWordNet, виявилось, що не вдається для синсетів виявити антоніми, хоча вWordNetсловниках така інформація була в наявності. Помилка виникла внаслідок нерозуміння власнеWordNet : антоніми в ньому визначені для лем а не для синсетів(http://code.google.com/p/nltk/issues/detail?id=98).

Не правильне розуміння семантики Python. Проста помилка виникає при не правильному розумінні області дії двох операторів. Наприклад, "%s.%s.%02d" % "ph.d.", "n", 1 викликає помилкуTypeError: not enough arguments for format string. Помилка виникає внаслідок того що оператор% має вищий приорітет ніж оператор кома. Для виправлення цієї помилки потрібно дужками виділити область дії оператора:

 

>>> "%s.%s.%02d" % "ph.d.", "n", 1

Traceback (most recent call last):

File "<pyshell#1>", line 1, in <module>

"%s.%s.%02d" % "ph.d.", "n", 1

TypeError: not enough arguments for format string

>>> "%s.%s.%02d" % ("ph.d.", "n", 1)

'ph.d..n.01'

Наступний приклад. Необхідно визначити функцію для знаходження в тексті всіх слів заданої довжини.Функція має параметри для тексту та довжини слова і допоміжний параметр, який дозволяє задати початкове значення для результатів, як параметр:

 

>>> def find_words(text, wordlength, result=[]):

... for word in text:

... if len(word) == wordlength:

... result.append(word)

... return result

>>> find_words(['omg', 'teh', 'lolcat', 'sitted', 'on', 'teh', 'mat'], 3) #1

['omg', 'teh', 'teh', 'mat']

>>> find_words(['omg', 'teh', 'lolcat', 'sitted', 'on', 'teh', 'mat'], 2, ['ur']) #2

['ur', 'on']

>>> find_words(['omg', 'teh', 'lolcat', 'sitted', 'on', 'teh', 'mat'], 3) #3

['omg', 'teh', 'teh', 'mat', 'omg', 'teh', 'teh', 'mat']

При першому виклику функції find_words() #1, отримано правильний результат – всі слова з трьох літер. При другому виклику функції #2 початкове значення результату визначене , список з одного елементу['ur'], і результат також очікуваний – до початкового значення результату додалося єдине слово з двох літер. При наступному виклику find_words() #3з тими самими параметрами що і в #1, результат отримано неочікуваний, відмінний від#1, результат. Кожен раз, коли викликається функціяfind_words() без третього параметру, результат додається до результатів, які отримані при попередніх викликах а не додається до пустого спису, який визначений в параметрах функції. Поведінка програми неочікувана тому, що не правильно зроблено припущення, що значення по замовчуванню (пустий список) буде створюватися при кожному виклику програми. Насправді, це значення по замовчуванню створюється тільки при визначенні функції, і якщо третій параметр функції, при виклику, відсутній то використовується цей вже створений список.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]