Статические переменные в Python C API

Как можно было бы выставить «статические» переменные, подобные этому

class MyClass:
    X = 1
    Y = 2

через C API? Единственная переменная в PyTypeObject, которая, похоже, будет работать, — это tp_members, но я не вижу флага в PyMemberDef, указывающего, что член должен относиться к классу, а не к экземпляру.

Для большего пояснения, поскольку это может изменить ответ, я пытаюсь представить перечисление C Python так, чтобы перечисление

enum MyFlags {
    Alpha = 0,
    Beta = 1
};

Можно получить доступ в Python как:

module.MyFlags.Alpha
module.MyFlags.Beta

person Toji    schedule 03.03.2010    source источник


Ответы (1)


Просто поместите их в тип tp_dict, например. с PyDict_SetItemString.

person Alex Martelli    schedule 04.03.2010
comment
Превосходно! Это то, что я искал. (Вы извините меня, если я воспользуюсь моментом, чтобы проверить это, прежде чем пометить это как ответ.) - person Toji; 04.03.2010
comment
Работает как рекламируется. :) Спасибо еще раз. - person Toji; 04.03.2010
comment
Со времени первоначальной публикации этого ответа в документы было добавлено следующее предупреждение: Предупреждение: небезопасно использовать PyDict_SetItem() или иным образом изменять tp_dict с помощью словаря C-API. - person user2357112 supports Monica; 20.07.2020
comment
Я думаю, что это предупреждение немного шире, чем должно быть — можно устанавливать записи в tp_dict, если имена не имеют соответствующих слотов (поэтому никакие настройки __add__ или __new__ и т. д. вот так), и после этого вы вызываете PyType_Modified для типа. - person user2357112 supports Monica; 20.07.2020