Archy
В своей работе я использую 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 из кодировки указанной в началеДалее...
Как это делается?
Строки комментария можно оставлять используя символ # или открывающие """ и закрывающие """
Документировать файлы модулей, функции и классы необходимо следующим образом. В модулях комментарий располагается в начале файла, в функциях и классах после объявления.Далее...
Поднятие объектно-ориентированного программирования на новый уровень
Большинство читателей уже знакомо с концепциями объектно-ориентированного программирования: наследованием, инкапсуляцией, полиморфизмом. Но создание объектов заданного класса с определенными родителями обычно представляется исходно заданной операцией. Оказывается, что ряд новых программных конструкций становится либо более простым, либо вообще хоть сколько-нибудь возможным, если вы можете настраивать процесс создания объектов. Метаклассы разрешают определенные типы "аспектно-ориентированного программирования"; например, можно усилить классы такими характеристиками, как возможности трассировки, объектная персистентность, регистрация исключений и так далее.
Краткий обзор объектно-ориентированного программирования (ООП)
Давайте, потратив полминуты, вспомним, что такое ООП. В языке объектно-ориентированного программирования можно определять классы, задача которых - объединить связанные данные и поведение. Эти классы могут наследовать некоторые или все свойства своих родителей, они также определяют свои собственные атрибуты (данные) или методы (поведение). В результате, классы, как правило, выступают в качестве шаблонов для создания экземпляров (которые время от времени называют просто объектами). Различные экземпляры одного и того же класса обычно имеют разные данные, хотя они будут представлены в одинаковом виде, например, у обоих объектов класса '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.Далее...
Декораторы функций - обеспечивают способ определять специальные режимы работы для функции, обертывая их дополнительным слоем логики, реализованной в виде других функций.
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Далее...
Файл - области постоянной памяти в вашем компьютере, которыми управляет операционная система. Объект файла создает функция 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()Далее...
В общем говоря над строками нельзя производить такие же действия, что и с числами. Но оператор + работает с текстом и означает сцепление строк.
#!/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()Здесь будут описаны особенности, расширенные возможности.Далее...
python ./manage.py runserver 127.0.0.1:3333
http://localhost:3333/
127.0.0.1 localhost#::1 localhost
Разработка компьютерной программы.
1. Введение
2. Выбор создаваемой программы
3. Написание технического задания
4. Разработка программы
5. Создание справочной системы
6. Тестирование программы
7. Создание установочного пакета и выпуск программы
8. Обновление и улучшение программы.
1. Введение
Компьютерная программа - это механизм, благодаря которому какая либо работа пользователя упрощается или автоматизируется, перекладывая работу с человека на компьютер. Программа должна создаваться с какой-то целью, упростить какую либо работу, автоматизировать какой-то процесс, в общем, выполнять определенную задуманную работу. Программы бывают разные развлекательные, образовательные, серверные и другие. Программы существуют с того дня с которого и появились первые компьютеры, в то далекое время программы были простыми и работали очень медленно, не из-за того, что программы были криво написаны, а из-за того, что компьютеры работали очень медленно.В наше время все изменилось, компьютеры работают быстро, а вот программы не очень. Почему же так? Да все просто, в далекие прошлые временна программы разрабатывались профессионалами своего дела, а сейчас разработать программу может любой желающий. Не каждый начинающий разработчик может, создавать программу нормально, учесть все нюансы ее работы, впоследствии чего программа работает нестабильно. Данная статья покажет ту небольшую часть, которую должен пройти каждый разработчик, создавая компьютерную программу.Далее...
Возникли вопросы по Python?
- Python для начинающих 71
- Python и запуск програм 16
- SQLite 12
- Веб-программирование 7
- Взаимодействие с Интернетом 401
- Видео уроки 7
- Запуск программ на Python 4
- Изучение PyQt5 12
- Изучение wxPython 1
- Модули 8
- Обработка исключений 3
- Общие вопросы 190
- ООП на Python 12
- Примеры Python 30
- Работа с изображениями 4
- Разработка интернет-приложений 8
- Как использовать proxy с помощью библиотеки Requests?
- Как работают функции в Python?
- Топ наиболее востребованных языков программирования
- Изучение языка программирования Python с помощью Brain Up!
- Распаковка последовательности в отдельные переменные
- Создание своего веб-фреймворка на Python - Часть 1
- Какая версия Python самая быстрая?