расширение словаря модулей в cpython для возврата объектов с произвольными именами

#python #dictionary #module

#python #словарь #модуль

Вопрос:

Мне было поручено внедрить интерфейс python в наше программное обеспечение для моделирования. Прошу прощения, но это мое первое знакомство с python, поэтому это медленный процесс. Я работал в CPython

Вот моя проблема. Если пользователь вводит:

a = model_123456 (например), я бы хотел, чтобы он возвращал соответствующий объект. Проблема в том, что эти объекты динамически создаются в программном обеспечении.

Я не хочу заполнять globals() dict потенциально тысячами этих объектов, если к ним никогда не обращаются.

Я не хочу реализовывать его как метод, например: a = getmodel(123456), поскольку мы стремимся к краткости, предоставляя наибольший доступ через атрибуты членов, а не методы.

Я исследовал различные решения, но ни одно из них не кажется применимым или понятным (например, «gettr в модуле»)

Я думаю, что мне нужно создать словарь в моем модуле верхнего уровня, из которого я могу переопределить метод getitem?

Если это так, у меня возникли проблемы с выяснением, как это сделать в CPython.

например: m = PyModule_Create(amp;tdmodule)
Вопрос 1: Это уже возвращает объект с набором tp_dict . Как бы я иначе установил / переопределил этот слот?

Вопрос 2. Как мне переопределить функцию getitem объекта PyDict в CPython (или создать словарь с этим аналогичным атрибутом)? Нужно ли мне создавать словарь с помощью настраиваемого метода сопоставления getsubscript или я могу просто setattr в setitem?

Еще раз приношу свои извинения, если этот вопрос звучит запутанно и содержит много неверных предположений, вероятно, так оно и есть.

Спасибо за любые разъяснения, Роб.

Комментарии:

1. Это немного неясно. Существует множество способов сделать модуль не модулем, но трудно понять, как вы собираетесь его использовать и где он вам нужен.

2. Конструкция ошибочна. Вы должны реализовать настраиваемый поиск атрибутов в классе, а не в модуле.

3. Кроме того, я бы рекомендовал реализовать как можно больше этого на Python, а не на C. Так намного проще.

4. Проблема в том, что dict модуля должен быть a dict (а не просто какое-либо отображение или даже подкласс dict). CPython вызывает PyModule_GetDict внутренне и ожидает, что он вернет dict (он использует PyDict_xxx функции, подобные PyDict_SetItem возвращаемому значению). PyDict_SetItem не используется tp_as_mapping , он использует внутренние функции dict для вставки значения. Поэтому ваш лучший вариант — отказаться от этой идеи и вместо этого использовать экземпляр вашего пользовательского типа. И если вам не нужен доступ к сторонней библиотеке C, вы должны сделать это на чистом Python.

5. Большая часть этого реализована на C, поскольку в основном пишутся объекты для непосредственного взаимодействия с объектами C в нашем программном обеспечении. Как только эта базовая работа будет выполнена, последуют сценарии python более высокого уровня. Если я выполняю поиск настраиваемых атрибутов в классе, а не в модуле, это означает, что наши выражения будут несколько длиннее везде. Например, скажем, я хочу, чтобы time возвращал текущий объект time. Я могу использовать time().frame или project.time.frame, но не time.frame, учитывая, что наш предыдущий язык сценариев выразил бы это как просто: $ F мы уже делаем вещи довольно длинными, если это имеет смысл.