Minoru 24.12.2011 17:48 antaeus

Есть у меня набор классов, каждый из которых я хотел бы хранить в отдельном файле, а последние складывать в отдельный каталог (чтобы не мешались). Но в таком случае их нельзя импортировать (каталог-то мой, в sys.path его нет). Можно превратить директорию в пакет, но тогда класс PageNotFound приходится импортировать монструозной конструкцией вида from pages.PageNotFound import PageNotFound.
Господа, как быть? Существует ли изящное решение, или мне модифицировать sys.path?

1. Elemir 24.12.2011 17:50 netbook

Использовать ocaml или haskell — изящное решение

2. utros 24.12.2011 17:52 pedobook

В файл init.py пакета их пропиши, а путь к пакету добавь в sys.path

3. Minoruutros /2 24.12.2011 17:56 antaeus

Ты имеешь в виду __all__ в __init__.py пакета? Это не то. Можно будет делать from pages import *, но доступ к классам все равно через имя класса будет (PageNotFound.PageNotFound, например).
Basically, я хочу что-то такое, чтобы классы были в отдельных файлах, строка импорта выглядела не так монструозно, а после импорта доступ к классу можно было осуществлять безо всяких модификаторов.

4. MinoruMinoru /3 24.12.2011 17:57 antaeus

s/модификаторов/namespace specifiers/

5. Minoru 24.12.2011 18:04 antaeus

Решил проблему, импортировав все модули пакета в его __init__.py:
from .PageNotFound import *
Теперь можно делать from pages import PageNotFound, всё работает.

6. SirAnthony 24.12.2011 18:04 home

В __init__.py в модуле-директории пишешь какой-нибудь импортер.

7. utrosMinoru /3 24.12.2011 18:05 pedobook

Да, именно его. Кто тебе мешает в init.py импортировать нужные тебе классы и вписать их в __all__?

8. Minoruutros /7 24.12.2011 18:13 antaeus

А зачем в __all__ вписывать, коли уже импортировал?

9. MinoruSirAnthony /6 24.12.2011 18:13 antaeus

Так и сделал, /5 же.

10. utrosMinoru /8 24.12.2011 18:14 pedobook

Хорошая практика. Хотя если ты импортировал только то, что тебе нужно, можно и опустить.

11. Minoruutros /10 24.12.2011 18:17 antaeus

Погоди, разве __all__ не для того, чтобы указывать пакеты, которые следует импортировать при 'from PKGNAME import *'? Я думал, его только для этого и применяют.

12. utrosMinoru /11 24.12.2011 18:19 pedobook

Да, для этого. Я тут немного теряю нить обсуждения.

13. Minoruutros /12 24.12.2011 18:21 antaeus

Если __all__ ни для чего кроме from PKG import * не используется, то мне всё ясно и обсуждение, вобщем-то, завершено. Если же эта переменная служит ещё какой-то цели, то я таки хотел бы узнать, какой — интереса ради.

14. dorfe 24.12.2011 21:33

> набор классов
> класс PageNotFound
> как быть?
> изящное решение

спасибо, сделал мой день!

15. Minorudorfe /14 24.12.2011 21:39 antaeus

Не понимаю, что именно тебе не понравилось. Помимо PageNotFound, в том же пакете сейчас ещё четыре класса, скоро прибавится ещё.

16. dorfeMinoru /15 24.12.2011 21:40

Да ничего-ничего, тебе всё равно не понять моей радости ибо #ohshin

17. Minorudorfe /16 24.12.2011 21:43 antaeus

Я таки требую объяснений.

18. dorfeMinoru /17 24.12.2011 21:48

-_-
Сам попробуй объяснить шутку человеку без чувства юмора — это скучно и безперспективно. Кому надо — тот сам давно посмотрел http://macton.smugmug.com/gallery/893670... например за оопмоска, ну а про питон и говорить особо нечего. В общем, сапиенти сат.

19. SirAnthonydorfe /18 24.12.2011 21:52 home

>галерея не работающая без яваскрипта >что-то говорит про хороший, неперегруженный код

20. dorfeSirAnthony /19 24.12.2011 21:53

а?

21. Minorudorfe /18 24.12.2011 22:08 antaeus

Ты меня обвиняешь в ООПГМ? Серьёзно?
Ок, вот тебе задача. На сайте есть странички. Также есть WSGI приложение, эти странички генерящее и раздающее. У каждой странички свой собственный html-шаблон и кусочек логики. Некоторые из страниц могут принимают не только GET, но и POST-запросы. Как ты это реализуешь? Просто накидай примерную структуру приложения.

22. MinoruMinoru /21 24.12.2011 22:19 antaeus

А пока ты читаешь задание и набираешь ответ (на что я искренне надеюсь), я объясню, почему данную задачу я решил с помощью классов.
Основное приложение получает от сервера строку с запросом. Из неё легко извлекается адрес запрашиваемой страницы и переданные параметры. С точки зрения структурного программирования решением является большой switch, параметром которого является адрес странички, а в каждом case'е идёт проверка на то, каким именно методом передан запрос с последующим вызовом соответствующей функции. Ну или просто вызов функции, которая, опять-таки, проверяет тип запроса и вызывает другую функцию.
Мне это решение кажется излишне громоздким, поэтому я объявил список таплов (адрес, обработчик), где обработчик — это класс с методом __call__. Таким образом, главное приложение после получения запроса пробегается по списку (это медленнее, чем switch, но у меня будет не очень много разных страниц) и находит подходящий обработчик. Создаётся временный объект, который и вызывается с переданными GET'ом или POST'ом параметрами. В __call__ определяется тип запроса и вызывается self.get() или self.post(), где и происходит обработка данных и генерация странички результата.
Все классы-обработчики наследуются от базового класса, реализующего методы-заглушки.

Всё это позволяет мне добавлять страницы, не копипастя много кода (достаточно объявить новый класс, наследующийся от базового, и добавить его имя в список), что было бы неизбежно в случае структурного программирования (как минимум, пришлось бы копировать dispatcher, запускающий разные процедуры в зависимости от типа запроса).

На Python это пишется потому, что это курсовая работа по веб-технологиям, и единственной разрешённой альтернативой ему является PHP. Думаю, мой выбор теперь не вызывает удивления.

Извини за простыню, но ты меня реально задел.

23. dorfeMinoru /21 25.12.2011 18:27

Я не обвиняю, для меня это просто очевидно :) И вообще меня просто порадавало class TwoPlusTwo и т.п., просто посмеялся от души, хотя стоило бы поплакать, да...
А так спасибо, я говновебом не занимаюсь, его любой школьнег осилит.

24. dorfeMinoru /22 25.12.2011 18:27

> А пока ты читаешь задание и набираешь ответ (на что я искренне надеюсь)

Оставь недежду всяк сюда входящий (ц), я уж спал давно.

> я объясню, почему данную задачу я решил с помощью классов.

Мда, лучше б даже не начинал...

> просто вызов функции
> Мне это решение кажется излишне громоздким, поэтому я объявил список хуйни с трехуровневой иерархией.

...

> Все классы-обработчики наследуются от базового класса

Oh, I just saw it coming :)))

> это позволяет мне добавлять страницы, не копипастя много кода

Правильно, зачем мне писать много кода, пусть лучше компилятор нагенерит мне его ещё больше и тормознее! :)

> dispatcher

Ты поди и банду четырёх чтишь, да?

> потому, что это курсовая работа по веб-технологиям
> Думаю, мой выбор теперь не вызывает удивления.

Безусловно, я и сам на каком только говне курсовые не писал, это ещё хорошо что хоть питон у вас :)

> Извини за простыню, но ты меня реально задел.

А вот это реально хорошо (хотя цели я такой себе не ставил), значит ты не безнадёжен!

25. Minorudorfe /23 25.12.2011 18:34 antaeus

Где ты нашёл TwoPlusTwo?

26. Minorudorfe /24 25.12.2011 18:43 antaeus

> > просто вызов функции
> > Мне это решение кажется излишне громоздким, поэтому я объявил список хуйни с трехуровневой иерархией.
> ...
Похоже на тупую ненависть к ООП безо всякого обоснования. Монструозный switch мне кажется менее элегантным решением, чем список классов.

> > это позволяет мне добавлять страницы, не копипастя много кода
> Правильно, зачем мне писать много кода, пусть лучше компилятор нагенерит мне его ещё больше и тормознее! :)
За что ты так не любишь оптимизирующие компиляторы?

> > dispatcher
> Ты поди и банду четырёх чтишь, да?
Не читал и не собираюсь, вобщем-то.

27. dorfeMinoru /25 25.12.2011 18:53

для меня это выглядело как class TwoPlusTwo, если не class OnePlusOne :)

28. dorfeMinoru /26 25.12.2011 18:53

> тупую ненависть к ООП

Ненависть к ООП тупою не бывает!

> безо всякого обоснования

Сам гугли себе обоснавания, я уже одну ссылку давал, вот ещё: http://tinyurl.com/6kburz

> За что ты так не любишь оптимизирующие компиляторы?

За что ты так не любишь логику и подтасовываешь мои высказывания своими софизмами? Как сильно твои "оптимизирующие компиляторы" соптимизируют bubble sort? ;)

> > Ты поди и банду четырёх чтишь, да?
> Не читал и не собираюсь, вобщем-то.

А вот это правильно!

29. Minorudorfe /28 25.12.2011 19:06 antaeus

> Сам гугли себе обоснавания, я уже одну ссылку давал, вот ещё: http://tinyurl.com/6kburz
Я придерживаюсь той точки зрения, что ООП не так уж плохо, но его слишком часто используют даже там, где оно не нужно. Ты же, похоже, считаешь, что это просто гиблая парадигма.

> > За что ты так не любишь оптимизирующие компиляторы?
> За что ты так не любишь логику и подтасовываешь мои высказывания своими софизмами? Как сильно твои "оптимизирующие компиляторы" соптимизируют bubble sort? ;)
Я понимаю, что оверхед от диспатчинга методов никто мне не уберёт. Просто твоя фраза как бы намекнула, что оптимизировать нужно руками, что и привело к моему вопросу.

30. dorfeMinoru /29 25.12.2011 19:18

> Ты же, похоже, считаешь, что это просто гиблая парадигма.

Именно так, больше предпочитаю АОП/ДОП/ДДП.

> Просто твоя фраза как бы намекнула, что оптимизировать нужно руками, что и привело к моему вопросу.

Надо, в основном конечно алгоритмы (о чём я намекнул вопросом про bubble sort), но и в прямом смысле тоже порою надо — компилятор не всесилен и то что ты выкрутишь себе на всю -O3 -SSE3 -MakeItFast не гарантирует того, что он не пофакапит тебе выравнивание или ещё что-нибудь от чего всё будет тормозить — в общем рекомендую http://blog.gamedeff.com/?p=71 по этим вопросам почитать.

31. Minorudorfe /30 25.12.2011 19:33 antaeus

Закладки на эту серию валяются ещё с тех пор, как их на lwn постили, но все равно спасибо. Про АОП читаю, ДОП и ДДП не гуглятся что-то.

33. Minorudorfe /32 25.12.2011 22:52 antaeus

Ты дал русские аббревиатуры — я их и гуглил. Спасибо.

34. dorfeMinoru /33 25.12.2011 22:55

Тогда удивительно что ты даже аоп нагуглил :)

35. kbElemir /1 26.12.2011 09:36

а как там в сравнении с питоном тем же?

36. dorfekb /35 26.12.2011 17:17

а что там можно сравнивать?

37. kbdorfe /36 26.12.2011 17:18

решения

38. dorfekb /37 26.12.2011 17:51

чего?

Do you really want to delete ?