одного и того же модуля, и если да то как?
Зачем?
Пришла в голову интересная идея по реализации своего рода мета программирования. Хочу кое что потестить
Загружай модуль руками в обход стандартной системы импортов.
т.е. импортлибом?
да, importlib предоставляет набор примитивов для поиска и загрузки модулей.
Ну вот importlib.import реализует все что мне необходимо, кроме того, что он не возвращает объект модуля.
importlib.__import__ вернет уже загруженный модуль из кеша
а если я передам ему другой сет глобалов и локалов в параметрах?
а если почитать документацию?
попробуй и узнаешь.
в нее и смотрю
А расскажи подробнее, может это можно проще
Аучь. Не проще классы сделать?
Короче, у меня есть своя реализация парсера бинарных файлов, основанная на type-hint'ах и метаклассе, который при создании класса процессит эти тайпхинты и генерит правила для ридера. Формат, который необходимо сейчас распарсить существует в нескольких версиях. Отличаются наборы полей в структурах, иногда типы. В оригинале его парсят на крестах, и в оригинальном коде юзают либо шаблоны, либо препроцессор на ifdef'ах. Хочу в рамках такой реализации сделать аналог поведения препроцессора в данном случае, загрузив модуль несколько раз с переданной туда глобалкой со значением версии, или какими-то еще параметрами. Внутри же файла со структурами реализовать бранчинг по версии обычными if/else'ами по глобалке.
А может тебе через Annotated[] можно докинуть инфу о версии?
Так в дефайне самой структуры получается код version-agnostic. Т.е. структуры должны параметризоваться чем-то на ините.
Тогда я не понял, что зависит от версии
От версии зависить может тип поля, или наличие определенного поля структуры.
Так как может быть version agnostic описание структуры, если тип от версии зависит?
py VERSION = False // представим это приходит из вызова __import__ а не дефайнится здесь class TestStruct(metaclass=BinaryStruct): global VERSION a: int32_t b: char_t c: SomeOtherStruct if (VERSION >= 1): d: float32_t else: d: int32_t if (VERSION >= 1): def some_method(self, x, y, z): print(self.d) // operating on self.d which is a float else: def some_method(self, x, y): print(self.d) // operating on self.d which is an int, also using a different signature
version agnostic он в том плане, что специфицирует поведение для всех версий сразу, но на уровне меты, а не в исполнении методов результирующего класса
Обсуждают сегодня