内置魔术变量名称/属性

时间:2013-12-03 00:53:32

标签: python syntax sublimetext built-in magic-methods

背景 :对于那些不熟悉它的人,Sublime Text(和TextMate)通过{{1}定义的范围提供语法突出显示和其他功能语言定义文件,基本上是一组用于识别给定语言中各种结构的正则表达式,例如函数定义,各种类型的字符串,保留字等。

我是Python Improved包的维护者(如果你感兴趣,可以通过Package Control获得),旨在为Python提供更好的语言定义。如果需要,您可以在GitHub上阅读它,但其中一个关键特性是它实际上是维护的,这与许多未经过多年更改或更新的Sublime语言不同。

问题 :我最近一直关注双重强调的.tmLanguage内容,并在Rafe Kettler发现魔术this excellent treatise之后函数我能够相当多地扩展语言定义的那一部分。但是,我找到一个很好的内置魔术变量名称或魔术属性列表,如__magic____class__,我的运气不太好。我已经浏览了文档的Data Model部分,但它为我的目的留下了一些不足之处,似乎主要关注魔术方法名称。

所以我的问题是,__doc__范围应该包括哪些内容?这是它到目前为止的定义:

support.variable.magic.python

我开始这个项目的原因之一就是让自己更多地了解Python,到目前为止我确实取得了成功,但我现在还是有点困难。

为了清楚起见,我不是在寻找一个最喜欢的异地资源(尽管如果你有一个方便的链接,我会很感激)并且我不是想开始一个自以为是的讨论。我想弄清楚的是,这个列表是否看起来是合理的,或者是否有任何明显的错误。如果您想要自以为是,open an issue我会非常乐意与您讨论。

谢谢!

2 个答案:

答案 0 :(得分:7)

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__

答案 1 :(得分:6)

唉,数据模型文档是我能想到的最完整的东西,它甚至没有真正设计为索引。不过,我并不完全清楚你在寻找什么。 __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有一些新东西:metaclass shenanigans使用了__prepare__方法,函数和方法现在使用魔术名称作为属性,而不是像im_self这样的噪音(参见“用户定义的函数“数据模型的一部分”,模块和类上都有__qualname__

此外,importing PEP提到模块加载器应该做什么,包括设置一些魔术属性:__name____file____path____loader__,和__package__