• Внедрение зависимостей the Python way

      Зачем нужно внедрение зависимостей? Оно уменьшает связанность компонентов в приложение и упрощает тестирование. У некоторых разработчиков есть мнение, что внедрение зависимостей нужно только в больших проектах и что оно сильно усложняет программы. Думаю, это исторически сложилось из-за популярный фрейморков вроде Спринга или Джуса в Джаве. Особенно из-за Спринга, который является невероятным комбайном.

      Python-inject — это небольшая библиотека для внедрения зависимостей в Питоне. Третья версия написана в unix-стиле, т.е. она прекрасно выполняет только одну функцию и не пытается быть всем. В отличие от уже упомянутых Спринга и Джуса Инжект не ворует конструкторы классов у разработчиков, не навязывает разработчикам необходимость писать приложение в каком-то определенном стиле и не пытается управлять всем графом объектов приложения.

      Инжект практически не требует конфигурации (об этом подробнее подкатом) и очень прост в использовании.
      Например в тестах
      # Возможные зависимости
      class Db(object): pass
      class Mailer(object): pass
      
      # Внедряем зависимости в класс пользователя
      class User(object):
          db = inject.attr(Db)
          mailer = inject.attr(Mailer)
          
          def __init__(self, name):
              self.name = name
          
          def register(self):
              self.db.save(self)
              self.mailer.send_welcome_email(self.name)
      
      
       # Используем в тестах inmemory базу данных и моки.
      class TestUser(unittest.TestCase):
          def setUp(self):
              inject.clear_and_configure(lambda binder: binder \
                  .bind(Db, InMemoryDb()) \
                  .bind(Mailer, Mock()))
              
              self.mailer = inject.instance(Mailer)
          
          def test_register__should_send_welcome_email(self):
              # Пример теста.
              user = User('John Doe')
              
              # Регистрируем нового пользователя.
              user.register()
              
              # Должно отправиться письмо с приветствием.
              self.mailer.send_welcome_email.assert_called_with('John Doe')
      


      Читать дальше →
    • Pdef — компилятор и язык описания интерфейсов для веба

        В начале прошлого года мне пришла в голову идея написать собственный язык интерфейсов (IDL), который был бы похож на Protobuf или Thrift, но предназначался бы для веба. Я надеялся закончить его где-нибудь месяца за три. До первой стабильной версии прошло чуть больше года.

        Pdef (пидеф, protocol definition language) — это статически типизированный язык описания интерфейсов, который поддерживает JSON и HTTP RPC. Он позволяет один раз описать интерфейсы и структуры данных, а потом сгенерировать код для конкретных языков программирования. Пидеф подходит для публичных апи, внутренних сервисов, распределенных систем, конфигурационных файлов, как формат для хранения данных, кеша и очередей сообщений.

        Основная функциональность:

        • Развитая система пакетов, модулей и пространств имен.
        • Поддержка циклических импортов и зависимостей типов (с некоторыми ограничениями).
        • Простая система типов, основанная на четком разделении интерфейсов и структур данных.
        • Наследование сообщений (аналог struct'ов) и интерфейсов.
        • Поддержка цепочек вызовов, например, github.user(1).repos().all().
        • JSON как формат данных и HTTP RPC для передачи данных.
        • Возможность использовать другие форматы и RPC.
        • Подключаемые кодогенераторы (официально поддерживаются Java, Python и Objective-C).
        • Опциональность кодогенерации, т.е. Пидеф позволяет сериализовать данные и отправлять запросы руками.

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

        Пример описания сообщения:
        message Human {
            id          int64;
            name        string;
            birthday    datetime;
            sex         Sex;
            continent   ContinentName;
        }
        

        Примеры использования (примеры сгенерированного кода):
        Json
        {
            "id": 1,
            "name": "Ivan Korobkov",
            "birthday": "1987-08-07T00:00Z",
            "sex": "male",
            "continent": "europe"
        }
        

        Java
        Human human = new Human()
            .setId(1)
            .setName("John")
            .setSex(Sex.MALE)
            .setContinent(ContinentName.ASIA)
        
        String json = human.toJson();
        Human another = Human.fromJson(json);
        

        Python
        human = Human(id=1, name="John")
        human.birthday = datetime.datetime(1900, 1, 2)
        
        s = human.to_json()
        another = Human.from_json(s)
        

        Objective-C
        Human *human = [[Human alloc]init];
        human.id = 1;
        human.name = @"John";
        human.sex = Sex_MALE;
        human.continent = ContinentName_EUROPE;
        
        NSError *error = nil;
        NSData *data = [human toJsonError:&error];
        Human *another = [Human messageWithData:data error:&error];
        


        Установка, использование и руководство по языку
      • Материалы продвинутого уровня по Питону

          PythonВ мире все примерно распределяется в соответствии с принципом Паретто. Меньшая часть — богатые, большая часть — бедные (читающий, ты входишь в золотой миллиард). Тоже касается и материалов о программировании. Порой очень сложно найти хоть что-нибудь не начального уровня.

          После прочтения Dive into Python или подобной ей и ознакомления с документацией возникает вопрос, а что читать дальше? Можно обратиться к списку книг на python.org. Там есть раздел Advanced Books, но в нем всего лишь 6 книг (седьмая не выходила), и только одну я бы назвал по-настоящему стоящей.

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

          Ниже собраны сложные материлы про Питон, его устройство и возможности. Все на английском (грех, не знать технический английский). Про Dive into Python я слукавил. Большинство приведенных материалов требуют хорошее знание Питона и наличие опыта программирования на нем.

          Подробнее
        • Релиз PyDev 1.5 или PyDev Extensions теперь с открытым кодом

            imageВышла новая версия PyDev, плагина к Eclipse, позволяющего разрабатывать проекты на Питоне. В новой версии разработчик Fabio Zadrozny решил интегрировать в бесплатную открытую версию всю функциональность платного дополнения PyDev Extensions.

            В новой версии:
            • Продвинутая интерактивная консоль с авто-импортом,
            • Анализ качества кода в реальном времени,
            • Контекстно-независимое code-completion с авто-импортом,
            • Иерархическая диаграмма классов,
            • Консоль отладки с возможностью запуска удаленного дебаг-сервера.

            Подробную информацию можно узнать на официальном сайте PyDev.org, а также в блоге Fabio Zadrozny.

            Ссылки для скачивания