Как стать автором
Обновить

Комментарии 24

НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
(set-language-environment 'UTF-8)
(setq default-input-method 'russian-computer)

(set-selection-coding-system 'windows-1251)
(set-default-coding-systems 'windows-1251)
(prefer-coding-system 'windows-1251)

(custom-set-faces
;; custom-set-faces was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
'(default ((t (:inherit nil :stipple nil :background «gray17» :foreground «snow» :inverse-video nil :box nil :strike-through nil :overline nil :underline nil :slant normal :weight normal :height 98 :width normal :foundry «outline» :family «Courier New»))))
'(cursor ((t (:background «peach puff»))))
'(font-lock-comment-delimiter-face ((default (:inherit font-lock-comment-face)) (((class color) (min-colors 16)) (:background «green»))))
'(font-lock-comment-face ((nil nil)))
'(font-lock-doc-face ((t (:inherit font-lock-string-face :background «black»)))))

(setq auto-mode-alist
(append
'(
( "\\.el$". lisp-mode)
( "\\.py$". python-mode)
( "\\.html$". sgml-mode)
( "\\.xml$". sgml-mode)
)))

(global-font-lock-mode 1)

(autoload 'javascript-mode «javascript» nil t)
(add-to-list 'auto-mode-alist '("\\.js\\'". javascript-mode))

;; tool bar
(tool-bar-mode -1)

(set-background-color "#333333")
(set-foreground-color "#ffffff")

(setq scroll-step 1)
(global-hl-line-mode 1)

(windmove-default-keybindings 'meta)
(fset 'yes-or-no-p 'y-or-n-p)

(iswitchb-mode 1)
(global-set-key [?\C-,] 'previous-buffer)
(global-set-key [?\C-.] 'next-buffer)

(put 'upcase-region 'disabled nil)
(delete-selection-mode 1)

;;(setq inhibit-startup-message t)
(setq default-tab-width 4)

(desktop-save-mode t)
(global-set-key [f5] 'call-last-kbd-macro)
(global-set-key [f11] 'buffer-menu)
(global-set-key [f10] 'bookmark-bmenu-list)

(global-set-key [?\C-'] 'toggle-truncate-lines)
(put 'narrow-to-page 'disabled nil)

что не понравится (set-language-environment 'UTF-8)
(setq default-input-method 'russian-computer)

(set-selection-coding-system 'windows-1251)
(set-default-coding-systems 'windows-1251)
(prefer-coding-system 'windows-1251)

(custom-set-faces
;; custom-set-faces was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
'(default ((t (:inherit nil :stipple nil :background «gray17» :foreground «snow» :inverse-video nil :box nil :strike-through nil :overline nil :underline nil :slant normal :weight normal :height 98 :width normal :foundry «outline» :family «Courier New»))))
'(cursor ((t (:background «peach puff»))))
'(font-lock-comment-delimiter-face ((default (:inherit font-lock-comment-face)) (((class color) (min-colors 16)) (:background «green»))))
'(font-lock-comment-face ((nil nil)))
'(font-lock-doc-face ((t (:inherit font-lock-string-face :background «black»)))))

(setq auto-mode-alist
(append
'(
( "\\.el$". lisp-mode)
( "\\.py$". python-mode)
( "\\.html$". sgml-mode)
( "\\.xml$". sgml-mode)
)))

(global-font-lock-mode 1)

(autoload 'javascript-mode «javascript» nil t)
(add-to-list 'auto-mode-alist '("\\.js\\'". javascript-mode))

;; tool bar
(tool-bar-mode -1)

(set-background-color "#333333")
(set-foreground-color "#ffffff")

(setq scroll-step 1)
(global-hl-line-mode 1)

(windmove-default-keybindings 'meta)
(fset 'yes-or-no-p 'y-or-n-p)

(iswitchb-mode 1)
(global-set-key [?\C-,] 'previous-buffer)
(global-set-key [?\C-.] 'next-buffer)

(put 'upcase-region 'disabled nil)
(delete-selection-mode 1)

;;(setq inhibit-startup-message t)
(setq default-tab-width 4)

(desktop-save-mode t)
(global-set-key [f5] 'call-last-kbd-macro)
(global-set-key [f11] 'buffer-menu)
(global-set-key [f10] 'bookmark-bmenu-list)

(global-set-key [?\C-'] 'toggle-truncate-lines)
(put 'narrow-to-page 'disabled nil)

это часть .emacs которая для меня особо необходима. попробуйте.
Зря Вы простынёй это сюда запостили, лучше бы линк на файл… =\
НЛО прилетело и опубликовало эту надпись здесь
ок, ступил не спорю
а не расскажете про упаковку приложения в py2exe? а то с pyqt4 постоянно какие-то проблемы возникают
Обратите внимание на PyInstaller — малоизвестный инструмент, между тем превосходящий по фичам и удобству упомянутый py2exe.

Один из ключевых моментов — автоматически распознает и подключает PyQt/lxml и прочие библиотеки. Т.е. не надо делать абсолютно никаких телодвижений — оно работает «из коробки».

Впрочем, для объективности отмечу и минусы — для поддержки .manifest файлов требует патча (не знаю как с этим у py2exe), и лучше использовать SVN-ветку программы т.к. они почему-то уже год с лишним как не хотят выкладывать на публику версии своей утилиты, несмотря на то, что работает отлично и разработка идет, проект не мертв.
Хотелось бы видеть в начале статьи краткую аннотацию с описанием того, что конкретно делает ваша программа.

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

Какая цель этой статьи? Кому должна быть полезна?

Тот кто не знает PyQt от такого изложения не поймет ничего. А кто знает, скажет вам, что код ваш откровенно средненького качества.

Опишите интересные и полезные, на ваш взгляд, моменты, а скачивание кода сделайте архивом — так всем и проще и удобней — можно не только прочитать, но и самостоятельно запустить или подредактировать.

Если сейчас там есть какие-то достойные моменты — то их не видно в вашей куче. Если нет — то незачем писать статью.

В данный момент все это похоже на «Я вот сделал за вечер на коленке программку, посмотрите какой я молодец, вот ее исходник».
Я бы такую статью бы с удовольствием прочитал ранее, статья не салат-копипаст. полезна для тех, кто часто пишет комменты типа «скоро буду изучать питон».

>А кто знает, скажет вам, что код ваш откровенно средненького качества.
Вы подскажите что не так, я подучусь.

а скачивание кода сделайте архивом
а разве я не так сделал.

А вообще ваш коммент заменить на — «вы мне не нравитесь. я умнее.»
Уважаемый, ну зачем сразу же так агрессивно…

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

Лишь хочу сказать, что в данной статье не хватает (помимо подсветки кода) некоторой центральной идеи.

Говорю о том, что читателю вряд ли нужна точно такая программа, как есть у вас. Читатель хочет научиться чему-то, каким-то принципам, каким-то приемам.

Потому полезно ткнуть пальцем «вот тут сделано то-то так-то потому, что...». А учиться лишь по одному исходнику способны гики, которые вряд ли обучаются программированию на хабре.
На вас не обижаюсь, даже буду рад если дадите какое-то ценное указание.

код ваш откровенно средненького качества.
аргументируйте, хоть как-то.
Не обижайтесь, пожалуйста, но код похож либо на то, что вы очень торопились, и главное было сделать программу с заданными функциями в заданный срок, либо вы еще изучаете инструментарий.

Например участок с конфигурационным файлом. Вместо
mod = __import__(modName)
host = getattr(mod, 'host', 'horn:intur')
user = getattr(mod, 'user', 'SYSDBA')

можно использовать простое и понятное
import settings
… settings.host…
… settings.user…

Кроме читаемости это будет соответствовать принципам «Simple is better than complex», «Namespaces are one honking great idea» и другим, включенным в The Zen of Python.

Так же, например, код:
def completeFile(self, i):
… widget = self.ui.listWidget
… text = widget.item(i).text()
… widget.item(i).setText('%s\t%s' % (text, u'готово'))
… self.ui.progressBar.setValue(0)


Читая его получаем:
функция «завершить i-й файл»:
… На форме у нас есть некоторый ListWidget, возьмем его
… Допишем к тексту i-го элемента в нем слово «готово»
… Возьмем некоторый прогрессбар на форме и установлим его прогресс в 0.


Отсюда сразу встают вопросы, что за ListWidget, что за элементы в нем хранятся, каково их назначение, и почему функция «завершить файл» вместо того, чтобы завершать этот файл, лишь констатирует факт что файл завершен.

Я не претендую на истинность своих слов, это лишь результат быстрой выкладки, но можно было бы переписать так:
def file_completed(self, file_index):
… file_item = self.ui.file_list.item(file_index)
… file_item.setText( '%s\t%s' % (file_item.text(), u'готово') )
… self.ui.current_file_progress.setValue(0)


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

1. В моем случае скрипт запустится при незаполненных переменных host, user. В вашем случае он упадет, __import__(modName), позволяет вынести в начало файла название скрипта настроек, у вас он вбит внутри код, что не есть хорошо.

2. Во втором случае, вы меня потрясли))
Переименовать названия виджетов — это признак большой искусности программиста.

По-моему код прозрачен, вот сущности выполняющие основные действия:

Container — (пре запуск программы, проверка настроек)
-->Wnd — (класс окошка и отрисовка виджетов)
----->MainModel — управление парсингом и загрузкой
--------->DbConn — контейнер sql, и подключение к БД.

1. Если меняется название скрипта настроек, то имеет смысл обратиться к модулю ConfigParser и вынести настройки в ini-файл, оставив при этом в покое сам модуль конфигурационного файла.

2. Идеи правильного именования вы найдете в таких трудах, как «Совершенный код» (глава 11), «Domain driven development» и многих других.

Позволю себе привести отрывок из первой упомянутой книги:
Имя переменной нельзя выбирать, как кличку собаке:… В отличие от собаки и ее клички, которые являются разными сущностями, переменная и ее имя формируют по идее одну сущность. Поэтому и адекватность переменной во многом определяется ее именем. Выбирайте имена переменных со всей тщательностью.


Попробуйте читать код после обфускатора, если считаете что стиль и имена переменных не имеют значения.
2. Найдите хоть одну здравую программу на питоне которая использует ini-файлы.

1. имена переменных и виджетов абсолютно разные вещи возьмите любой gui-туториал от qt, и посмотрите там имена виджетов. Это не принципиально потому что, в на форме может быть сотня виджетов и важдому присваивать имя это никому не нужная работа.
Имена переменных в моем коде все корректны.

1. Давайте не доводить до абсурда. Если вам не нравится формат INI — сделайте в XML, YAML или любом другом формате, который вам нравится.

Суть не в конкретном формате, а в том, что есть модуль Settings, в котором есть параметры.

Откуда они там берутся — это проблема модуля settings и никакого другого модуля программы.

2. Про переменные даже отвечать не буду. Я вам привел ссылки на литературу, считаю что этого достаточно.
абсурд — это ваши замечания, объективно почему получился код средненький, как написать лучше вы не сказали.
Статья содержит пару идеологических просчётов:
1. Исходники в cp1251. Что не самое страшное, пока код не выпускается из ваших рук.
2. Просчёт похуже: скриншоты текста в jpg

это не xkcd, не ищете текста alt
Какая прелесть :)
эта прелесть — регулярный гость на хабре :-)
В принципе пост хороший, но уж больно «галопом по Европам». Пример написания гуевого приложения, работающего с БД, рассчитаный на новичковую аудиторию, имхо, лучше бы расписать подетальнее и пообширнее — и это задача не из простых. Не менее интересны и комментарии к тексту!
Ссылки с кодом не рабочие…
на гитхабе выложить не можете? а то ссылки уже на рабочие
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории