Как реализовать единый поиск атрибутов Python (__getAttribute__) в C ++, обработка дескрипторов и Metaclasses?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как реализовать единый поиск атрибутов Python (__getAttribute__) в C ++, обработка дескрипторов и Metaclasses?

Сообщение Anonymous »

Я разрабатываю интерпретатор Python с нуля в C ++ в качестве хобби, чтобы углубить мое понимание внутренних групп языка. Я понимаю основы: атрибуты экземпляра обычно находятся в __dict __ объекта, в то время как методы и другие атрибуты класса находятся на типе объекта и находятся путем пересечения MRO. Поведение собственных методов типа (например, int .______ __ ) определяется на его MetaClass (обычно тип ).
Моя проблема заключается в создании единого, сплоченного алгоритма в C ++, который правильно обрабатывает все сценарии поиска, которые кажутся конфликтыми в первом сроке.
< /p>
Я пытаюсь согласовать логику для следующих случаев: < /p>

Код: Выделить всё

# Case 1: Method on an instance
# The lookup should find `__str__` on the `int` type and "bind" it
# to the instance `3` to provide `self`.
(3).__str__()

# Case 2: Method on a type (Metaclass)
# Here, the lookup should happen on the type of `int` (the metaclass, `type`),
# find the `__str__` defined there, and bind it to the `int` type object.
# The expected result is the string "", not the same function from Case 1.
int.__str__()

# Case 3: Attribute on an instance
# The lookup seems to start directly at the `3` object to return its type.
(3).__class__ # Returns the `int` type object

# Case 4: Attribute on a type
# The lookup starts at the `int` object to return its type.
int.__class__ # Returns the `type` metaclass object
Что я попробовал

В моей реализации C ++ у меня есть базовые классы pyobject и pytypeobject . Моя первая попытка состояла в том, чтобы создать две отдельные функции Find , одна для экземпляров и другая для типов, но это чувствует себя неправильно и не решает проблему единым способом.

Код: Выделить всё

// Pseudo-code of my flawed attempt
struct PyObject {
PyTypeObject* ob_type;
Scope* scope; // My __dict__

// Lookup on instances
virtual PyObject* find(string name) {
// 1. Check my instance's __dict__ (scope)
// 2. If not found, search the MRO of my type
// ...
}
};

struct PyTypeObject : PyObject {
// Lookup on types (override)
PyObject* find(string name) override {
// Different logic that searches the metaclass MRO
// ...
}
};
< /code>
Этот подход не кажется правильным. Мое исследование показывает, что ключом к объединению этого является протокол дескриптора (в частности __get __ 
), но я изо всех сил пытаюсь визуализировать, как интегрировать его в один алгоритм Lookup, который работает для всех случаев. эквивалент объекта .__ getattribute __ или cpython's tp_getattro ), который правильно разрешает эти конфликтующие сценарии? Последовательность для проверки obj .__ Dict __ , type (obj) .mro () ,
и обработка данных и не дате-десптор? Unified Algorithm для
dinfive между вызовом на экземпляре (например (3) .__ str __ < /code>) и
вызов на тип (например, int .__ str __ < /code>)? В качестве ссылки для моей реализации C ++ было бы
невероятно полезно. < /p>
< /li>
< /ol>
Любое объяснение, псевдокод или указатели на то, как CPYTHON реализует его TP_GetAttro < /code> слот был бы очень полезным. Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/796 ... te-in-c-ha
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»