Мне нужен способ проверки класса, поэтому я могу безопасно идентифицировать, какие атрибуты являются определяемыми пользователем атрибутами класса. Проблема в том, что такие функции, как dir(), inspect.getmembers() и друзья, возвращают все атрибуты класса, включая предварительно определенные: __class__
, __doc__
, __dict__
, __hash__
. Это, конечно, понятно, и можно утверждать, что я мог бы просто перечислить список именованных членов, чтобы игнорировать, но, к сожалению, эти заранее определенные атрибуты могут меняться с разными версиями Python, что делает мой проект уязвимым для изменения в проекте python - и мне это не нравится.
Пример:
>>> class A:
... a=10
... b=20
... def __init__(self):
... self.c=30
>>> dir(A)
['__doc__', '__init__', '__module__', 'a', 'b']
>>> get_user_attributes(A)
['a','b']
В приведенном выше примере я хочу безопасный способ получить только определенные пользователем атрибуты класса ['a', 'b'] не 'c', поскольку это атрибут экземпляра. Поэтому мой вопрос: может ли кто-нибудь помочь мне с вышеупомянутой фиктивной функцией get_user_attributes(cls)
?
P.S. Я потратил некоторое время, пытаясь решить проблему, разобрав класс на уровне АСТ, что было бы очень легко. Но я не могу найти способ преобразовать уже обработанные объекты в дерево AST node. Я думаю, вся информация AST отбрасывается, как только класс был скомпилирован в байт-код.
С наилучшими пожеланиями, Якоб