Перейти до основного вмісту

Публікації

Показано дописи з жовтень, 2010

Переходимо на Python 3. Новий print.

Віднедавна вирішив почати освоювати Python 3, а свої враження і досвід вивчення писати в блог, таким чином, щоб і самому структурувати нові знання і читачам було цікаво. Так що welcome до першого посту про нову реалізацію стандартного виводу. Перше знайомство Напевне, перше, що кидається в очі при переході на Python 3, це нова реалізація механізму стандартного виводу - оператор print був замінений на функцію print() . Навіщо? Така, здавалося б, назначна, зміна . Що ж, варто дослідити проблему більш детально. Історія Нарікання на реалізацію виводу як оператора print неодноразово виникали і активно обговорювались в списку розсилки (Python-dev mailing list), і вилились всі вони в один єдиний документ - PEP3105 . В даному документі зразу ж можна побачити список недоліків оператора print. Викладі їх коротко у вільному перекладі і своїх коментарях в дужках: print - єдина операція рівня додатку, під яку виділений оператор, і, в принципі він там не потрібен (сильно, так сказати, багато честі

Мої сумбурні враження від PyCon UA 2010

Розпишу, мабуть, по пунктах Дуже сподобалась доповідь Андрія Свєтлова. Мінусами були тільки проблеми з підключенням ноута до проектора, а також те, що його швидко "зігнали" зі сцени за відсутністю часу. Дуже пізнавальна доповідь по внутрішній організації коду на python, а такоє цінні примітки в по багатопоточності (думаю, тим, хто займаєтьсяя цим, було корисно послухати, а тим більше - новачкам. Цікава доповідь "Good API Design" від Armin Ronacher. Дуже класно оформлена, показав як API робити не треба, і як треба на прикладах. Тобто оформив основні принципи і розжував їх.   Чувачок з Техасу з доповіддю по GeoDjango дуже класно підготувався в плані використання українських назв в класах і локаціях (типу class Oblast, Київ і т.д.), в принципі показав таке собі шоу з Django + Google Earth, розказав про стандарти геокодування. Досить цікаво, якщо почитати цим займатись, то він дав дуже хороші вказівки, куди рухатись. До слова, він же і є core-developer цього самого GeoD

Як дізнатись параметри процессора в Windows XP за допомогою Python

Власне, я знайшов два способи, як це зробити. Спосіб 1 - через реєстр Інформацію про ваш CPU можна отримати, зчитавши шлях HKEY_LOCAL_MACHINE\HARDWARE\ \DESCRIPTION\\System\\CentralProcessor\\0 . Ось як це виглядає: Отримати доступ до реєстру в Python дуже легко за допомогою модуля _winreg, який входить в стандартну бібліотеку. Ось, що потрібно зробити, щоб отримати тактову частоту процесора: import _winreg handle = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, '\HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0') value = _winreg.QueryValueEx(handle, '~MHz') Спосіб 2 - бібліотека WMI Бібліотека WMI (Windows Measurement Instruments) , написана Тімом Голденом, дозволяє вирішити цю задачу набагато швидше. >>> import wmi >>> c = wmi.WMI() >>> c.Win32_Processor()[0].MaxClockSpeed 2812 >>> c.Win32_Processor()[0].NumberOfCores 2 Насправді, значення, яке ми отримуємо в Win32_Processor()[0] - це об'єкт класу, спецификацію як

Робота з Git в Windows через https

Пробема Знадобилось мені отримати доступ на коміт до проекта на github, а лінуксова віртуальна машина, в середовищі якої я працював, не запускалась. Так як часу розбиратись з машиною, а тим більше, перевстановлювати, не було - вибрав більш швидке рішення - працювати з Git під Windows через Https. Оскільки msys/Git у мене вже був встановлений, а проект витягнутий з репозиторія в режимі read-only, ось що вийшло з першого разу: D:\wishmaster\wishmaster>git remote rm origin D:\wishmaster\wishmaster>git remote add origin https://.... D:\project\project>git pull Password: error: error setting certificate verify locations: CAfile: /bin/curl-ca-bundle.crt CApath: none while accessing https://SSPkrolik@github.com/SSPkrolik/wishmaster.git/info/refs fatal: HTTP request failed Не сильно радує. Ну, з цієї ситуації є два виходи. Вихід 1 - відмовляємось від перевірки сертифікату Для цього робимо наступне: git config --global http.sslverify "false" Вуаля. Все працює. Вихід

Схрещуємо pywinauto і py2exe

А починалось все з GUI-додатку Якось знадобилось мені в додатку зробити автоматизовану роботу з зовнішніми програмами, а конкретно з Adobe Reader. Задача полягала в наступному. При виконанні пошуку в Python-додатку (тобто, вводимо текст в wxPython GUI) - відкривати PDF-файл за допомогою Adobe Reader, але не просто відкривати, а так, щоб в рядку пошуку уже було введене слово, за яким виконується пошук інформації, а сам PDF-документ був відкритий на першому знайденому результаті. Крім того, додатком розповсюджується під Windows-платформи, а виконувані файли створються за допомогою py2exe. Але вимагалась деяка автоматизація дій користувача Для вирішення задачі був обраний pywinauto - прекрасна бібліотека для тестування GUI-додатків. І хоча в даному випадку ніякого тестування немає, з автоматизацією вона також справляється на ура. І тут в прекрасний світ Python вривається exe-формат Все прекрасно працює, якщо запускати python скрипт. Проблеми виникають у випадку, коли запускається цей ж

wx.PaintDC не перемальовує картинку

Дуже цікавий ефект, а точніше помилку, я отримав при малюванні на формі (wx.Frame) за допомогою wx.PaintDC. Ось код події wx.EVT_PAINT, який використовувався спочатку: def on_paint(self, evt): self.dc = wx.PaintDC(self) self.dc.DrawBitmap(self.background, 0,0, True) Як ви вже, маюуть, здогадались, дані маніпуляції виконуються для відмальовки фону вікна, а точніше саме вікно в формі зображення. Приклад можна підглянути в wx.Demo -> Miscellaneous -> ShapedWindow . Так от, такий код приводить до того, що, якщо деактивувати вікно (відбудеться подія ex.EVT_ACTIVATE), а потім знову активувати (ця ж подія), то контроли всередині вікна не відмалюються. Теперь поглянемо на код, який працює правильно: def on_paint(self, evt): dc = wx.PaintDC(self) dc.DrawBitmap(self.background, 0,0, True) Як бачите, проблема вирішилась тим, що ми не робимо контекст атрибутом вікна. Чому так? Хороше запитання, і відповідь на нього поки не знаю, не заглиблювався. Але якщо хто знає, пишіть в к

Підводний камінь позиціювання вікон в wxPython

Уявімо собі вікно (wx.Frame), яке потрібно розмістити на екрані згідно з деяким алгоритмом, наприклад, відцентрувати. Що ми робило? class MyFrame(wx.Frame): ... def __init__(self): ... ds = wx.DisplaySize() self.SetPosition((ds[0] / 2 - self.Size[0] / 2, ds[1] / 2 - self.Size[1] / 2)) ... Нехай метод __init__ містить ще масу програмного коду для ініціалізації вікна. В такому випадку, логічно, що вищеописана операція повинна бути описана після всіх маніпуляцій з розмірами вікна. Часто такі операції відбуваються неявно, і, як наслідок, вікно позиціонирується абсолютно неправильно , і про це варто пам'ятати. Прикладом такої неявної зміни розмірів вікна может бути, наприклад, установка сайзера (wx.Sizer): self.SetSizer(self.main_sizer) self.Fit() В такому випадку вікно "підтягне" свій розмір під сайзер і, відповідно, позиціювання пройде неправильно.

Особливості промислового копіювання файлів в Python

Зіткнувся з задачею копіювання файлів в Python. Задача полягала в тому, щоб копіювати повністю структуру папок з одного місця в інше, запускати програму, а пітом видаляти весь вміст, який був скопійованим. Перші кроки Перше, що прийшло в голову - використовувати для задачі os.walk(). Дана функція виконує рекурсивний прохід по вказаному шляху, приймаючи параметром папку в якості кореня дерева, яке необхідно обійти. Варто зазначити, що тут важливим параметром є topdown , в тому випадку, якщо ви на кожному кроці хочете виконувати якій дії (в моєму випадку - це прогрес бар, який є індикатором проходження процесу копіювання). Це опціональний параметр, який приймає булеве значення, яке визначає порядок обходу. Для копіювання вирішив використовувати функцію copy модуля shutil , який входить в стандартну бібліотеку python. Вуаля, все працює. Видаляємо файли післе запуску програми, аналогічно обходячи дерево, тільки уже в тій папці, в яку файли були скопійовані. Невеличка проблемка Нащо це

Django: підлий request.is_ajax()

Мабуть всі, ну, чи майже всі Django-розробники стикались з необхідністю використовувати Ajax в своїх проектах. Ні, я не буду розказувати про ajax в Django в загальному, а тільки про прекрасний метод is_ajax() об'єкту request, який, як відомо, передається параметром в view handler. Наскільки мені відомо по своєму досвіду і по досвіду знайомих, часто з ним виникає один прикольний казус. Давайте поглянемо на наступні рядки коду: def my_view(request, *args, **kwargs): ... if request.is_ajax: ... def my_view(request, *args, **kwargs): ... if request.is_ajax(): ... Як ви вже здогадались, правильною є другий запис. Цікаво те, що назва методу так і спонукає подумати, що цо не метод, а властивість, тобто @property, а перший варіант завжди будеу повертати True в умові. Не попадайтесь =).