Быстрый в изучении - мощный в программировании
>> Telegram ЧАТ для Python Программистов

Свободное общение и помощь советом и решением проблем с кодом! Заходите в наш TELEGRAM ЧАТ!

>> Python Форум Помощи!

Мы создали форум где отвечаем на все вопросы связанные с языком программирования Python. Ждем вас там!

>> Python Канал в Telegram

Обучающие статьи, видео и новости из мира Python. Подпишитесь на наш TELEGRAM КАНАЛ!

Archy

Remote debugging: PyCharm, pydev, rsync, django, postgis

26 марта 2013 г. Archy Общие вопросы

Remote debugging: PyCharm, pydev, rsync, django, postgisВ своей работе я использую PyCharm — отличную среду разработки, которая много всего умеет, упрощает рутину(чем сильно повышает продуктивность разработчика) и вообще не заменима для Django-devелоперов.

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

  • На рабочей машине(Mac) разрабатываю под PyCharm
  • В PyCharm как правило постоянно включена удаленная отладка.
  • Для работы удаленной отладки в код проекта, необходимо внести 2 строки кода для запуска отладки и положить 1 файл, доступный в python-path.
  • После внесения изменений в код, я на рабочей машине запускаю скрипт, который закачиваюет изменения на сервер с помощью rsync и перезагружает сервер проекта.

Про настройку удаленной отладки в PyCharm

В директорию проекта нужно положить файл из директории PyCharm под названием: pycharm-debug.egg. В Django-проекте я нахожу то место, которое мне нужно отладить и в начале отлаживамого def’а(например) ставлю следующий код:

sys.path.append(‘/home/webmail/src/pycharm-debug.egg’)
from pydev import pydevd
pydevd.settrace(’213.180.204.11′, port=32456, stdoutToServer=True, stderrToServer=True)
IP адрес и порт – это те по которым внешний сервер будет стучаться для того, чтобы найти запущенный PyCharm, которому он выдаваст отладочную информацию. Адрес Необходимо, настроить NAT, чтобы такие запросы попадали на машину разработчика.

Так как я на сервере не использую Django Development Server, а вместо него — nginx+uwsgi, то в параметрах запуска uwsgi я указал 1 процесс. Иначе будут сложности с отладкой, из-за нескольких попыток подключиться к моему компьютеру.

Важно! Для удаленной отладки исходные коды должны быть идентичны на локальном и удаленном сервере, в противном случае, может проявиться странное поведение дебаггера.

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

Далее...

В python есть 2 объекта работающими с текстом: unicode и str, объект unicode хранит символы в формате (кодировке) unicode, объект str является набором байт/символов в которых python хранит остальные кодировки (utf8, cp1251, cp866, koi8-r и др).

Кодировку unicode можно считать рабочей кодировкой питона т.к. она предназначена для её использования в самом скрипте - для разных операций над строками.

Внешняя кодировка (объект str) предназначена для хранения и передачи текстовой информации вне скрипта, например для сохранения в файл или передачи по сети. Поэтому в данной статье я её назвал внешней. Самой используемой кодировкой в мире является utf8 и число приложений переходящих на эту кодировку растет каждый день, таким образом превращаясь в "стандарт".

Эта кодировка хороша тем что для хранения текста она занимает оптимальное кол-во памяти и с помощью её можно закодировать почти все языки мира ( в отличие от cp1251 и подобных однобайтовых кодировок). Поэтому рекомендуется везде использовать utf8, и при написании скриптов.

Использование

Скрипт питона, в самом начале скрипта указываем кодировку файла и сохраняем в ней файл

# coding: utf8

либо

# -*- coding: utf-8 -*-

для того что-бы интерпретатор python понял в какой кодировке файл

Строки в скрипте

Строки в скрипте хранятся байтами, от кавычки до кавычки:

print 'Привет'

= 6 байт при cp1251

= 12 байт при utf8

Если перед строкой добавить символ u, то при запуске скрипта, эта байтовая строка будет декодирована в unicode из кодировки указанной в началеДалее...

Документирование кода в Python

Документирование кода в Python 
Сегодня мы поговорим о том как документируется код в языке Python. Документация кода достаточно важный аспект, ведь от нее порой зависит читаемость и быстрота понимания вашего кода.

Как это делается?

Строки комментария можно оставлять используя символ # или открывающие """ и закрывающие """

Документировать файлы модулей, функции и классы необходимо следующим образом. В модулях комментарий располагается в начале файла, в функциях и классах после объявления.Далее...

Поднятие объектно-ориентированного программирования на новый уровень

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

Краткий обзор объектно-ориентированного программирования (ООП)

Давайте, потратив полминуты, вспомним, что такое ООП. В языке объектно-ориентированного программирования можно определять классы, задача которых - объединить связанные данные и поведение. Эти классы могут наследовать некоторые или все свойства своих родителей, они также определяют свои собственные атрибуты (данные) или методы (поведение). В результате, классы, как правило, выступают в качестве шаблонов для создания экземпляров (которые время от времени называют просто объектами). Различные экземпляры одного и того же класса обычно имеют разные данные, хотя они будут представлены в одинаковом виде, например, у обоих объектов класса 'Employee' bob и jane есть .salary и .room_number, но значения room (комната) и salary (жалование) у каждого различны.

Яндекс.ДиректВсе объявленияЯ хочу лучше фотографировать! Запишись на бесплатный онлайн-семинар по фотографии и секретам мастерства! webinar.disted.ru

Некоторые объектно-ориентированные языки программирования, включая Python, предусматривают интроспективные (или рефлексивные) объекты. Другими словами, интроспективный объект может сам себя описывать: к какому классу принадлежит этот экземпляр? Кто предки этого класса? Какие методы и атрибуты доступны объекту? Интроспекция позволяет функции или методу, управляющему объектами, принимать решения, основываясь на том, какой вид объекта передается. Даже без интроспекции функции часто ветвятся, опираясь на данные экземпляра - например, маршрут к jane.room_number отличается от пути к bob.room_number, поскольку они в "различных комнатах" (значения room у них различны). С помощью интроспекции также можно безошибочно вычислить bonus (премиальные) jane, пропустив это вычисление для bob, например, потому что у jane есть атрибут .profit_share или из-за того, что bob является экземпляром производного класса Hourly(Employee).

"Метапрограммный" ответ

Базовая система ООП, очерченная выше, является достаточно мощной. Однако, в этом описании один момент не получил должного внимания: в Python (и других языках) сами классы являются объектами, которые можно передавать и подвергать интроспекции. Но поскольку объекты, как отмечалось, создаются с использованием классов в качестве шаблонов, то что же является шаблоном для создания классов? Разумеется, метаклассы.

В Python всегда были метаклассы. Однако, технология, задействованная в метаклассах, стала гораздо более очевидной с выходом Python 2.2. А именно, в версии 2.2 Python перестал быть языком только с одним специальным (обычно невидимым) метаклассом, который создавал каждый объект класса. Теперь программисты могут наследоваться от встроенного метакласса type и даже динамически генерировать классы с различными метаклассами. Разумеется, только то, что вы можете манипулировать метаклассами на Python 2.2, еще не объясняет, зачем вам это.

Более того, вам не нужно использовать метаклассы, определенные пользователем, чтобы управлять созданием классов. Несколько менее головоломная концепция - фабрика классов (class factory): обыкновенная функция может возвращать класс, который был динамически создан в пределах тела функции. В традиционном синтаксисе Python вы можете написать: Далее...

Ссылки на изменяемые объекты долго живут К изменяемым объектам в Python относятся списки, словари и объекты наследуемые от базового класса object. Будьте крайне внимательны при написании программ, помните что связь на изменяемый объект сохраняется всегда.

class M(object):
    def __init__(self, data):
        self.__data = data
    def data(self):
        return self.__data
init_data = ['php']
m = M(init_data)
print m.data() # ['php']
init_data.append('python')
# объекты init_data и M.__data ссылаются на один и тот же объект
print init_data # ['php', 'python']
print m.data() # ['php', 'python']
data = m.data()
print data # ['php', 'python']
data.append('ruby')
# теперь уже 3 объекта ссылаются на одну и ту же переменную
print data # ['php', 'python', 'ruby']
print init_data # ['php', 'python', 'ruby']
print m.data() # ['php', 'python', 'ruby']

На самом деле даже если вы отправляете объект в функцию, связь не теряется на выходе. Функция возвращает ссылку на переменную.

M = lambda data: data
init_data = ['php']
m = M(init_data)
m.append('python')
print m # ['php', 'python']
print init_data # ['php', 'python']
print m is init_data # True

Будьте внимательны при написании программ, иногда необходимо чтобы метод класса или функция вернули новый объект, а не ссылку. Создать новый объект например из списка можно - list(lst), из словаря dict(). В остальных случаях поможет модуль copy.Далее...

Декораторы функций в Python

25 января 2013 г. Archy Общие вопросы

Декораторы функций в Python

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

class A:
    @staticmethod # декоратор в Python для создания статических методов
    def summ(x,y):
        return x+y
a = A.summ(6,7)
print a
# 13
class B: # альтернативная реализация класса А
    def summ(x,y):
        return x+y
    summ = staticmethod(summ)
b = B.summ(6,7)
print b
# 13
class Counter: # класс как декоратор
    def __init__(self, func): # принимаем в качестве параметра декорируемую функцию
        self.func = func # запоминаем декорируемую функцию
        self.calls = 0
    def __call__(self, *args): # вызов декоратора, *args - аргументы декорируемой функции
        self.calls += 1
        if self.calls >= 3:
            print "function summ call %s" % (self.calls,) # если функция summ была запущена 3 или больше раз
        return self.func(*args)
@Counter
def summ(a,b,c):
    return a+b+c
print summ(5,9,2)
print summ(1,7,2)
print summ(4,9,3)
# 16
# 10
# function summ call 3
# 16
Далее...

Работа с файлами в Python

20 января 2013 г. Archy Общие вопросы

Работа с файлами в Python

Файл - области постоянной памяти в вашем компьютере, которыми управляет операционная система. Объект файла создает функция open или file.

При работе с файлами используется буферизация и она включена по умолчанию. При буферизации данные не записываются в файл непосредственно при вызове метода записи. Они записываются, когда все действия с файлом прекращены или вызвана функция close().

f1 = open("test") # по умолчанию файл открывается в режиме r(чтение)
f2 = open("test", "w") # файл открывается для записи
f2 = open("test", "w", 0) # отключает буферизацию, данные сразу записываются в файл (например при вызове метода write())
f3 = open("test", "a") # файл открывается для записи в конец
f4 = open("test", "a+") # файл открывается как для чтения так и для записи в конец
f5 = open("test", "ab") # добавляя к режиму символ "b" мы можем работать с файлам как с двоичными данными(интерпритация символа новой строки отключена)
xfile = open("test.txt")
xString = xfile.read() # прочитать весь файл в строку
xString = xfile.read(N) # прочитать N-байтов в строку
xString = xfile.readline() # прочитать текстовую строку включая символ конца строки
xList = xfile.readlines() # прочитать весь файл целиком в список строк
xfile.write(xString) # записать строку в файл
xfile.writelines(xList) # записать строки из списка в файл
xfile.close() # закрытие файла в ручную (выполняется по окончанию работы с файлом)
xfile.flush() # выталкивает выходные буферы на диск, файл остается открытым
xfile.seek(N) # изменяет текущую позицию в файле для следующей операции, смещая ее на N-байтов от начала файла
Пример скрипта который сам создает файлы Python c баш-строкой.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
myfile = open("newfile.py", "w")
myfile.write("#!/usr/bin/env python\n# -*- coding: utf-8 -*-")
myfile.close()
Скачать и сохранить файл, используя Python

#!/usr/bin/env python
# -*- coding: utf-8 -*-
url = "http://www.google.ru/index.html"
import urllib
webFile = urllib.urlopen(url)
localFile = open(url.split('/')[-1], 'wb')
localFile.write(webFile.read())
webFile.close()
localFile.close()
Далее...

Работа со строками в Python

10 января 2013 г. Archy Общие вопросы

Работа со строками в Python

В общем говоря над строками нельзя производить такие же действия, что и с числами. Но оператор + работает с текстом и означает сцепление строк.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
def primer_3(): # Объявление функции primer_2()
    a='Я'
    b=' программирую на языке'
    f=' Python'
    print (a+b+f+' :)') 
            # сцепляем строковые переменные a, 
         # b, f и 'текст' :)
def main():
    primer_3()
    return 0
 
if __name__ == '__main__':
    main()
Оператор * тоже можно использовать, но при условии, что одним из операндов будет целое число. данный оператор символизирует операцию повторения строки. Пример:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
def primer_4(): # Объявление функции primer_4()
    a='Я'
    b=' программирую на языке'
    f=' Python \n' # специальный символ \n
                # означает переход на следующую
                # строку
    g=a+b+f
    print (g * 3) 
               # распечатывам значение
            # переменной g 3 раза
def main():
    primer_4()
    return 0
 
if __name__ == '__main__':
    main()
Здесь будут описаны особенности, расширенные возможности.Далее...

Встроенный Django сервер тормозит на Windows 7

20 декабря 2012 г. Archy Общие вопросы

Встроенный Django сервер тормозит на Windows 7

Столкнулся с такой вот проблемой, что встроенный сервер Django очень долго обрабатывает запросы в операционной системе Windows 7. Ситуация примерно такая. Запускаем сервер:
python ./manage.py runserver 127.0.0.1:3333
Заходим на сайт:
http://localhost:3333/
После этого получаем контент только после долгой задержки, что не очень приятно в процессе активной разработки или тестирования сайта. Оказывается, проблема возникает из-за, кто бы подумал, IPv6, так как понятие localhost в контексте наличия разных протоколов уже не такое однозначное. Поэтому делаем 2 шага:
1. Раскомментируем строчки (у кого они не раскомментированы в C:/Windows/System32/drivers/etc/hosts)
127.0.0.1 localhost
#::1 localhost
2. Заходим на сайт не через localhost, а по 127.0.0.1.
Вы любите смотреть фильмы онлайн? Советуем вам топ онлайн кино 2012. Удачного вам просмотра фильмов.

Разработка компьютерной программы

25 сентября 2012 г. Archy Общие вопросы 1

Разработка компьютерной программыРазработка компьютерной программы.

1. Введение

2. Выбор создаваемой программы

3. Написание технического задания

4. Разработка программы

5. Создание справочной системы

6. Тестирование программы

7. Создание установочного пакета и выпуск программы

8. Обновление и улучшение программы.

1. Введение

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

В наше время все изменилось, компьютеры работают быстро, а вот программы не очень. Почему же так? Да все просто, в далекие прошлые временна программы разрабатывались профессионалами своего дела, а сейчас разработать программу может любой желающий. Не каждый начинающий разработчик может, создавать программу нормально, учесть все нюансы ее работы, впоследствии чего программа работает нестабильно. Данная статья покажет ту небольшую часть, которую должен пройти каждый разработчик, создавая компьютерную программу.Далее...