Встроенные имена/атрибуты магической переменной

Предыстория: для тех, кто не знаком с ней, Sublime Text (и TextMate) обеспечивает подсветку синтаксиса и другие функции через области действия, которые определяются в файлах определения языка .tmLanguage, в основном набор регулярных выражений для идентификации различные конструкции в данном языке, такие как определения функций, различные типы строк, зарезервированные слова и т.д.

Я поддерживаю пакет Python Improved (доступный через Контроль пакетов, если вам интересно), который призван стать лучшим определением языка для Python. Вы можете прочитать об этом на GitHub, если хотите, но одна из ключевых особенностей заключается в том, что он действительно поддерживается, в отличие от многих возвышенных языков, которые не менялись и не обновлялись годами.

Вопрос: недавно я сосредоточился на материалах с двойным подчеркиванием __magic__, и после нахождения этого превосходного трактата Рэйфа Кеттлера о магических функциях я смог расширить эту часть определения языка немного. Однако мне повезло меньше, если я нашел хороший список имен встроенных магических переменных или магических атрибутов, таких как __class__ или __doc__. Я просмотрел раздел Data Model в документации, но он оставляет желать лучшего для моих целей и, кажется, фокусируется в основном на именах магических методов.

Итак, мой вопрос: что должно быть включено в область действия support.variable.magic.python? Это его определение до сих пор:

\b__(all|bases|class|debug|dict|doc|file|members|metaclass|methods|module|name|slots|weakref)__\b

Одной из причин, по которой я начал этот проект, было больше узнать о Python, и я определенно добился успеха, но я застрял в этом.

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

Спасибо!

Ответ 1

Увы, документ модели данных - это самая полная вещь, о которой я могу думать, и она даже не разработана как индекс. Я не совсем понимаю, что вы ищете; __all__ является глобальным модулем, __slots__ является атрибутом класса, __weakref__ отображается только как строка внутри списка слотов, а __module__ - это атрибут функции и др. Я предполагаю, что какой-либо специальный атрибут, который обычно не может быть вызван, затем?

Конечно, вы всегда можете спросить Python.

>>> dir(type)
['__abstractmethods__', '__base__', '__bases__', '__basicsize__', '__call__', '__class__', '__delattr__', '__dict__', '__dictoffset__', '__dir__', '__doc__', '__eq__', '__flags__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__instancecheck__', '__itemsize__', '__le__', '__lt__', '__module__', '__mro__', '__name__', '__ne__', '__new__', '__prepare__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasscheck__', '__subclasses__', '__subclasshook__', '__weakrefoffset__', 'mro']
>>> import sys
>>> dir(type(sys))
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

С первого взгляда вам явно не хватает __mro__ и __subclasses__. Усложнение этого в некоторой степени состоит в том, что существуют некоторые специальные методы, которые используются только в коде, который встроен в Python, а не в основной язык: примеры включают __format__ (используется str.format) и различные методы ABC.

Я даже не знаю, что такое __weakrefoffset__.

Обратите внимание, что у Python 3 есть несколько новых вещей: там __prepare__ метод, используемый метаклассовыми shenanigans, функциями и методами теперь использует магические имена для своих атрибутов, а не как шум, например im_self (см. "Пользовательские функции" раздел "Модель данных" ), а там __qualname__ для обоих модулей и классов.

Кроме того, импортирует PEP указывает точно, что должен делать загрузчик модуля, в том числе установить некоторые магические атрибуты: __name__, __file__, __path__, __loader__ и __package__.

Ответ 2

import gc

print("\n".join(sorted({attrname for item in gc.get_objects() for attrname in dir(item) if attrname.startswith("__")})))
#>>> __about__
#>>> __abs__
#>>> __abstractmethods__
#>>> __add__
#>>> __all__
#>>> __and__
#>>> __annotations__
#>>> __author__
#>>> __base__
#>>> __bases__
#>>> __basicsize__
#>>> __bool__
#>>> __build_class__
#>>> __builtins__
#>>> __cached__
#>>> __call__
#>>> __cause__
#>>> __ceil__
#>>> __class__
#>>> __closure__
#>>> __code__
#>>> __complex__
#>>> __concat__
#>>> __contains__
#>>> __context__
#>>> __copy__
#>>> __copyright__
#>>> __credits__
#>>> __date__
#>>> __debug__
#>>> __deepcopy__
#>>> __defaults__
#>>> __del__
#>>> __delattr__
#>>> __delete__
#>>> __delitem__
#>>> __dict__
#>>> __dictoffset__
#>>> __dir__
#>>> __displayhook__
#>>> __divmod__
#>>> __doc__
#>>> __enter__
#>>> __eq__
#>>> __excepthook__
#>>> __exit__
#>>> __file__
#>>> __flags__
#>>> __float__
#>>> __floor__
#>>> __floordiv__
#>>> __format__
#>>> __func__
#>>> __ge__
#>>> __get__
#>>> __getattr__
#>>> __getattribute__
#>>> __getitem__
#>>> __getnewargs__
#>>> __getstate__
#>>> __globals__
#>>> __gt__
#>>> __hash__
#>>> __iadd__
#>>> __iand__
#>>> __iconcat__
#>>> __ifloordiv__
#>>> __ilshift__
#>>> __imod__
#>>> __import__
#>>> __imul__
#>>> __index__
#>>> __init__
#>>> __initializing__
#>>> __instancecheck__
#>>> __int__
#>>> __inv__
#>>> __invert__
#>>> __ior__
#>>> __ipow__
#>>> __irshift__
#>>> __isabstractmethod__
#>>> __isub__
#>>> __itemsize__
#>>> __iter__
#>>> __itruediv__
#>>> __ixor__
#>>> __kwdefaults__
#>>> __le__
#>>> __len__
#>>> __loader__
#>>> __lshift__
#>>> __lt__
#>>> __missing__
#>>> __mod__
#>>> __module__
#>>> __mro__
#>>> __mul__
#>>> __name__
#>>> __ne__
#>>> __neg__
#>>> __new__
#>>> __newobj__
#>>> __next__
#>>> __not__
#>>> __objclass__
#>>> __or__
#>>> __package__
#>>> __path__
#>>> __pos__
#>>> __pow__
#>>> __prepare__
#>>> __qualname__
#>>> __radd__
#>>> __rand__
#>>> __rdivmod__
#>>> __reduce__
#>>> __reduce_ex__
#>>> __repr__
#>>> __reversed__
#>>> __rfloordiv__
#>>> __rlshift__
#>>> __rmod__
#>>> __rmul__
#>>> __ror__
#>>> __round__
#>>> __rpow__
#>>> __rrshift__
#>>> __rshift__
#>>> __rsub__
#>>> __rtruediv__
#>>> __rxor__
#>>> __self__
#>>> __set__
#>>> __setattr__
#>>> __setitem__
#>>> __setstate__
#>>> __sizeof__
#>>> __slots__
#>>> __stderr__
#>>> __stdin__
#>>> __stdout__
#>>> __str__
#>>> __sub__
#>>> __subclasscheck__
#>>> __subclasses__
#>>> __subclasshook__
#>>> __suppress_context__
#>>> __traceback__
#>>> __truediv__
#>>> __trunc__
#>>> __version__
#>>> __weakref__
#>>> __weakrefoffset__
#>>> __wrapped__
#>>> __xor__