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

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

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

Вопрос. Недавно я сосредоточил внимание на материалах с двойным подчеркиванием __magic__ и после нахождения этого превосходного трактата от Rafe Kettler по магическим функциям, я смог немного расширить эту часть определения языка. Тем не менее, мне было немного меньше удачи в поиске хорошего списка встроенных имен магических переменных или магических атрибутов, таких как __class__ или __doc__. Я просмотрел раздел Модель данных в документах, но он оставляет желать лучшего в моих целях и, кажется, фокусируется главным образом по именам магических методов.

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

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

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

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

Спасибо!

4b9b3361

Увы, документ модели данных - это самая полная вещь, о которой я могу думать, и она даже не разработана как индекс. Я не совсем понимаю, что вы ищете; __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__.

6
03 дек. '13 в 4:10
источник
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__
7
03 дек. '13 в 4:10
источник