и в процессе чтения до меня доходит что модуль был переоткрыт и сейчас расширяется!
У меня вопрос: зачем так делать? Почему бы просто не использовать наследование? Зачем вообще нужен манки-патчинг? Код становится на порядок запутанее. В том же С# для определения класса в разных файлах используется ключевое слово partial, ага значит определение может быть где то еще.
Ну не удобно же грепать. Одно дело когда за тебя это делает IDE, а другое дело когда нужно переключиться в терминал, посмотреть строки вывода, открыть файлы на нужных строках...
Опять же, собирать картинку в голове как устроен класс тяжело.
Учитываю политику государства(все запретить) будущее у grep туманное)
Объявляется подкласс Module, который определяет синглетон-метод load (на самом деле alias на new). При вызове load в контексте экземпляра вычисляется содержимое переданного файла, при этом у экземпляра переопределены load и require, чтобы импорт внутрь пространства имен имел рекурсивный характер. В результате получаем то, что тебе нужно. Вроде никакой особой магии в этом нет.
А еще, меньше всего нужны те, из-за которых потом долго и мучительно придется объяснять, почему написанный и даже работающий по праздникам код является неподдерживаемым куском говна, пропитанным утинизмами автора (и пр. ересью).
я рад за тебя)) но тем, кто столкнется с твоим кодом, я сочувствую.
затрет в глобальном неймспайсе функции и классы
Круто, но причем здесь руби)) В питоне нет аналогов модулей руби вообще.
Ты самостоятельно можешь обертывать сущности в зависимости от директории, это даже считается неплохой практикой. Так же как и хранить одну сущность в одном файле.
Что бы все что мы импортировали ложилось в какой нибудь namespace?
Глобальный неймспейс - одна из ключевых фишек руби
что значит ключевая фишка? ..точно так же затрет в глобальном...
Круто, но причем здесь руби))
ты нить разговора сразу забываешь? Что за фишка такая «глобальный неймспейс»? Когда все в куче? Это реально (нужная) фишка и такого нельзя достичь в других языках?
Что бы все что мы импортировали ложилось в какой нибудь namespace?
Нахрена эти сюрпризы.
Блин какие сюрпризы? То что имя модуля который ты импортируешь становится неймспейсом?
Всегда можно эмитировать поведение, только это, как правило будут костыли. Например, я хотел сделать реализацию для js, но пока отказался от этой идеи. В jruby, так и вовсе сделано, что ява машина работает данным образом.
Блин какие сюрпризы?
Такие, блин, сюрпризы. Есть класс ClassName, а у тебя он почему-то называется another_class_name. Это сюрприз - еще какой. Имена классов и модулей это то, что не нужно менять.
А есть возможность как в питоне проводить импорт? Что бы все что мы импортировали ложилось в какой нибудь namespace?
С открытыми классами в этом мало смысла. Обернуть то можно, но что делать, если подключаемая либа манкипатчит Kernel например? По сути это равнозначно засорению «глобального неймспейса». Нужно просто принять, что это не питон. Здесь собственно и нет никакого глобального неймспейса, а только контекст текущего self, который зависит от иерархии классов и подключенных миксинов. Хочешь (относительно) чистый неймспейс - наследуйся от BasicObject.
В системе всегда есть точки монтирования, которые постоянны, вокруг которых строятся остальные элементы. Это наблюдается где угодно, в файловой системе (например если ты внезапно переименуешь bin в AnotherBin, это плохо кончится), в сервисах dbus, в веб-сервисах в виде path (где физически находится сам сервер реализующий функционал по path никому не важно, их вообще может быть несколько). Так же и здесь, пространство имен является точкой монтирования функционала, и в конечном счете дает тебе API, реализация которого отходит на второй план и может заменяться.