Как бороться с динамической типизацией?

Я довольно часто писал на Python какие-то вспомогательные вещи, иногда сравнительно крупные, но почти всегда не знание типа объекта с которым работаешь было не критичным. Плюс возможность разрабатывать в IPython сильно облегчала жизнь. И так было до тех пор, пока я не решил плотно использовать Twisted. И оказалось что в IPython не попишешь нормально, а занание типов параметров в функциях обратного вызова и классов из обширного становится необходимостью.

И вот тут то я оказался в неком тупичке. Есть большое количество разнообразных классов со сложными интерфейсами. Перепробованные IDE (Eclipse, PyCharm и даже Emacs) не позволяют воспользоваться автодополнением в незнакомых им классах, что логично. В результате, весь код начинает выглядеть как пример ниже.

def _call_later(self, request):
"""
тут какое-то описание функции
@param request: тут какое-то описание параметра
@type request: Request (1)
"""

Да, безусловно, указывать 1 для каждой из создаваемых функций типы передаваемых параметров это решение, только оно выглядит как откровенный костыль. В итоге, у меня создается ощущение, что я как-то не верно использую этот замечательный язык… Что не так? Как с этим жить? Наиболее подходящим вариантом выглядит то, что все помнят параметры у API наизусть, я же вполне могу писать на C++ с подстановкой параметров исключительно из открытых файлов.

Remote: офис не обязателен

На днях дочитал крайне интересную книгу “Remote: офис не обязателен” от создателей небезызвестной компании 37signals (да, те самые авторы RoR). Меня давно интересует все что связанно с удаленной/частично удаленной работой, т.к. ходить в офис совсем невмоготу становится, так что книга оказалась более чем к месту и ко времени.

До прочтения Remote, мне и самому не раз приходила в голову мысль о том, что полноценно работать в офисе, особенно если это OpenSpace не возможно в принципе, т.к. там постоянно кто-то отвлекает: обсуждает прокачку танка в WoT, рыбалку, политику, да что угодно кроме работы! Хотя чем лучше обсуждение стороннего проекта у тебя под носом? В итоге, если понаблюдать за тем, как тратится время сотрудником в офисе, становится заметно что на выполнение полезной работы расходуется хорошо если 50% рабочего времени. А если сюда еще добавить кучу крайне важных и неимоверно “полезных” совещаний…
Continue reading

Разбитые надежды или просто непонимание?

В одной из лекций с PyCon US 2014 проскочила очень заинтересовавшая меня информация о том, что с Python 3.3 CPython поддерживает оптимизацию для классов, и старый вариант использования Python, когда класс могли просто заменить на Dict не верен в корне, т.к. Dict не поддерживает никакой типизации. Вроде все верно и логично: никак не ограничиваемый по данным ассоциативный массив против класса, в котором можно предсказать используемые типы и количество полей. Continue reading

Python 3.4, asyncio

Думаю, ни для кого не секрет то, что основная реализация языка программирования Python фактически не поддерживает многопоточности. Есть модули которые позволяют эмулировать потоки посредствам процессов, но подобный путь крайне требователен к ресурсам и поэтому его применимость крайне ограниченна, особенно для большого количества операций ввода/вывода. При этом, в подавляющем большинстве случаев, распараллеливание задач не несет какого-то серьезного практического смысла и просто является одним из возможных архитектурных решений. В качестве альтернативы потокам могут выступать асинхронные операции, а с учетом ограничений интерпретатора, подобный подход должен бы был быть родным подходом в Python уже много лет как. Тем не менее, появился долгожданный модуль asyncio только в Python 3.4, но это в любом случае лучше чем никогда.
Continue reading

Kaleidoscope на Rust

Существует довольно известное руководство, посвященное процессу разработки нового языка программирования с использованием LLVM в качестве back-end под названием Kaleidoscope. Руководство очень грамотно доносит то, с какими трудностями можно столкнуться в процессе разработки нового языка и как с ними справится. Для любого разработчика, у которого внезапно мелькнула в голове шальная мысль “хочу свой язык” к прочтению обязательно.
Так вот, на прошлой неделе в сообществе Rust промелькнула интересная ссылка на тот же Kaleidoscope, но написанный не на C++, а на Rust.

Callbacks, closures и модель памяти Rust

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

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

Разрушающее сопоставление с образцом

В Rust используется разрушающее сопоставление с образцом, что в купе с моделью памяти Rust, иногда, дает очень занятные эффекты. Для примера возьмем структуру MyStruct и создадим две переменные типа Option в которых будет лежать наша структура, в одном случае 1 в виде стекового объекта, а во втором в виде уникального указателя 2.

struct MyStruct {
    val: int
}
let stack_data = Some(MyStruct{val:42});   // (1)
let own_data = Some(~MyStruct{val:42});    // (2)

Continue reading

Модель памяти Rust, видео.

Обзорное выступление с рассказом о модели памяти Rust от ее автора Николоса Мастакиса. Вскользь сравнивается с моделью памяти C++. Достаточно интересное выступление для людей не имеющих какого-то опыта с Rust и оценивающих пригодность языка для решения своих задачь.

Rust в ядре OSX

Как-то в дискуссии на РСДН-е проскользнула мысль о том, что одной из ключевых сфер применения Rust может оказаться разработка не User-mode приложений, а драйверов. Вот и результат небольшого эксперимента:

17/12/13 23:43:23,000 kernel[0]: hello from rust

Continue reading