Форум сайта python.su
Ну традицию постараемся не нарушать. Но в последнюю поездку тебе “незачет” и ты сам знаешь почему
Офлайн
Да… Это всё Светлов виноват!
Постараюсь исправится…
Офлайн
artexnetparsers.py
Написал “для практики” простой парсер надуманно использовав парочку популярных фреймворков, при этом попытался учесть “расширяемость” проекта.
Офлайн
py.user.next
А Вы значит запоминаете логику всех приложений которые пишете?
Я не просил отлавливать логические ошибки в коде парсера, я это и сам могу, не хуже других. Умножать на сто..? Я не собираюсь плодить парсеры, у меня другой профиль, я вообще не понимаю почему Вы зациклились на этом слове. Можете просто проигнорировать этот файл. Это простой тестовый “проект”, в котором меня больше всего интересовал стиль написания на новом (пока что) для меня языке.
Если Вы имеете ввиду что этот код “вдруг” станет нерабочим, то согласен конечно. Я просто выбрал то что попалось под руку тогда. Значит придется “как-то” исправить, или вообще выбросить парсер и вставить что-то более долго-живущее.
P.S. Спасибо за то что просмотрели код.
Офлайн
4kpt_IV
Спасибо за интересный разговор по теме.
Подскажите, пожалуйста, как можно закрыть тему?
Офлайн
artexnetА я не отлавливал, я просто спросил, с чего ты взял, что одно мелкое изменение не сломает весь этот парсер?
Я не просил отлавливать логические ошибки в коде парсера, я это и сам могу, не хуже других.
artexnetКонечно. Но я не запоминаю, а код пишу так, чтобы потом читать его не более пяти минут. То есть я никогда не напишу функцию на три экрана, чтобы потом, прокурив её полчаса, строить в голове деревья со всеми ответвлениями для того, чтобы убедиться, что все её выходы обработаны.
А Вы значит запоминаете логику всех приложений которые пишете?
artexnetfor table_row in self.__g.doc.select('//table[@id="rb"]/tr'):
artexnetfor td in table_row.select('.//td'):
artexnetНо они не могут быть протестированы, потому что скопом лежат в одной функции, к содержимому которой нет доступа.self.rates[bank_logo_uri] = rate
artexnetНадо использовать один вызов метода str.format(), а для времени в виде datetime есть свои спецификаторы форматирования, так что strftime() вообще не нужна. Да и конкатенация через плюсы не принята, нужно использовать str.join().return self.update_time.strftime('%d/%m/%Y %H:%M:%S') + ' - ' + \ 'USD[' + '{:.2f}'.format(self.usd_buying) + ": " + '{:.2f}'.format(self.usd_selling) + ']; ' + \ 'EUR[' + '{:.2f}'.format(self.eur_buying) + ": " + '{:.2f}'.format(self.eur_selling) + ']'
artexnetДа, умножать на сто. Здесь ты парсишь один сайт, а надо будет добавить сто сайтов с разным кодом и разными базами, где всё похоже, но немного отличается.
Умножать на сто..? Я не собираюсь плодить парсеры
artexnetНу, прочитай pep8 тогда и Zen. Потому что ни того, ни другого в этом коде не наблюдается.
Это простой тестовый “проект”, в котором меня больше всего интересовал стиль написания на новом (пока что) для меня языке.
artexnetЯ имею в виду юнит-тесты, что ты даже не можешь их написать, потому что свалил всё в одну функцию.
Если Вы имеете ввиду что этот код “вдруг” станет нерабочим, то согласен конечно.
artexnetНу да, и вставить то же самое (скорее, заново написать), которое проживёт точно так же - до первой звезды.
Значит придется “как-то” исправить, или вообще выбросить парсер и вставить что-то более долго-живущее.
Отредактировано py.user.next (Янв. 29, 2016 14:55:27)
Офлайн
Ты путаешь атрибуты и атрибуты класса. Parser.banks и self.banks это абсолютно разные объекты.
banks = {} # Rates map {banks_name: rate} rates = {} # Requests counter number_of_requests = 0 def __init__(self): """Initializes a new instance of the class.""" self.log.info('parser is started') def get_rates(self): """Gets latest rates from target resource and stores in maps.""" self.log.info('number of requests: %s' % self.number_of_requests) self.log.info('opening URL %s' % URL_EN) self.__g.go(URL_EN) self.log.info('done') self.banks = {} self.rates = {}
Отредактировано Rodegast (Янв. 29, 2016 15:37:02)
Офлайн