![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
diam |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 348 Регистрация: 23.1.2005 Где: Екатеринбург Репутация: 3 Всего: 16 |
Итак, есть рутинный код.
Собственно говоря, блоки с рутиной повторяются периодически, и как-то неправильно писать по несколько раз один и тот же код. Сразу же напрашивается использование процедур (ООП здесь использовать, на мой взгляд, нерационально, так как рутинные действия используются только в одном месте - при загрузке информации с сайта). Что нужно блокам для использования в моём случае? Только имя пользователя, под которым заходить на сайт. И всё. А получить нужно объект загрузчика, причём тот, где произошла ошибка. Например, загружали машины, нужен объект loader.car.get_loader(), загружали модели, нужен loader.model.get_loader(). В голову пришёл только такой вариант:
Но этот вариант мне совершенно ненравится из-за использования global. Какие ещё могут быть варианты? |
||||
|
|||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 9 Всего: 70 |
Не очень понимаю зачем тут global. мне кажется либо нужно возвращать loader из функции, либо объявить его вне функции.
|
|||
|
||||
diam |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 348 Регистрация: 23.1.2005 Где: Екатеринбург Репутация: 3 Всего: 16 |
loader из функции возвращать не получится, поскольку может быть сгенерировано исключение. А вот записать так действительно можно:
Ещё варианты? |
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 9 Всего: 70 |
я не знаю что такое loader, поэтому не могу понять почему у тебя что-то вызвает проблему
|
|||
|
||||
setq |
|
|||
Unregistered |
Вложи в try... for по ('User1', 'User2'...) .
|
|||
|
||||
sir_Jack |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 15.1.2007 Репутация: 3 Всего: 4 |
тоже не до конца осознал суть кода, но если тебе надо знать в котором из вызовов load_car, load_model произошло исключение, то почему бы не внести это в переменную?
Не то? |
|||
|
||||
diam |
|
||||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 348 Регистрация: 23.1.2005 Где: Екатеринбург Репутация: 3 Всего: 16 |
Код сильно утрирован, что было проще описать проблему. Но всё же немного опишу loader. loader - объект, который используется для загрузки информации с www-сайта. Один из методов, который мне от него нужен при генерации исключения - get_page(). Возвращает страницу, которую разбирал и на которой накололся (изменилась структура представления данных, скорее всего). Позже я эти страницы разбираю и корректирую алгоритм получения данных. Собственно, поэтому он мне и нужен при генерации исключения. На самом деле, процедур таких много, и так их перечислять не имеет смысла, вопрос в другом: как написать эти процедуры и впоследствии их вызывать, что бы связь с переменной loader не терялась. Обратите внимание, что переменная loader в разных участках кода хранит у меня разные объекты.
Потому что при генерации исключения я потеряю эту самую переменную loader, из-за которой бьюсь. Добавлено @ 13:01 Давайте попробуем по другому. Итак, есть несколько кусков кода. Кусок 1:
Кусок 2:
Кусок 3:
И так далее. В коде программы мне нужно периодически вызывать эти куски, по разному меняя их местами, при этом необходимо, что бы переменная x никуда не исчезала. Т.е., выглядеть это должно примерно так:
|
||||||||||||
|
|||||||||||||
diam |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 348 Регистрация: 23.1.2005 Где: Екатеринбург Репутация: 3 Всего: 16 |
Другого решения не нашёл.
У кого ещё будут мысли? |
|||
|
||||
albertn |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 368 Регистрация: 17.7.2006 Где: г. Ставрополь Репутация: 30 Всего: 34 |
А почему бы не использовать классы, передавать их в функцию, а функция уже будет менять внутренние поля.
Добавлено @ 15:09 кстати и функции можно определить внутри этого класса |
|||
|
||||
diam |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 348 Регистрация: 23.1.2005 Где: Екатеринбург Репутация: 3 Всего: 16 |
Код в "кусках кода" жутко утрирован. И переменная "x" в моём настоящем коде есть объект loader: Поэтому мне так важна эта переменная. А куски кода запихал в функции piece_of_code по причине частой повторяемости кода. Но может я неверно воспринимаю, что ты хочешь сказать?
albertn, покажи пример, пожалуйста. |
||||
|
|||||
albertn |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 368 Регистрация: 17.7.2006 Где: г. Ставрополь Репутация: 30 Всего: 34 |
Переделал исходный код:
Хотя мне не нравится запись вида loader = loader.model.get_loader('User1'), и мне кажется, что красивее менять поля самого объекта а не заменять объект на другой. |
|||
|
||||
diam |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 348 Регистрация: 23.1.2005 Где: Екатеринбург Репутация: 3 Всего: 16 |
albertn, идея понятна, спасибо.
Замечания. 1. В таком виде оно не работает. Проверил на Python2.5. И было бы странно, если бы заработало. Потому как loader.car и loader.model - это модули, что такое x.loader.car и x.loader.model? 2. Как я уже говорил, всевозможные loader'ы - это разные объекты. Каждый из них отвечает за определённую страницу на сайте. Более того, одна и та же страница под разными пользователями позволяет делать разные вещи (скачивать счета в формате pdf под одним, просматривать список входящих машин под другим; ну это так, для примера). Соответственно, у этих загрузчиков и информация разная, и методы её выуживания, и методы её представления. Поэтому "менять поля самого объекта" не получится. Если довести до рабочего вида, будет примерно следующее:
За идею +. |
|||
|
||||
albertn |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 368 Регистрация: 17.7.2006 Где: г. Ставрополь Репутация: 30 Всего: 34 |
||||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Python: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |