内置魔术变量名称/属性

Mat*_*DMo 10 python syntax built-in magic-methods sublimetext

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

我是Python改进包的维护者(如果你感兴趣,可以通过Package Control获得),它旨在成为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
Run Code Online (Sandbox Code Playgroud)

我开始这个项目的原因之一就是自学了更多关于Python的知识,到目前为止我确实取得了成功,但是我有点陷入困境.

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

谢谢!

Eev*_*vee 8

唉,数据模型文档是我能想到的最完整的东西,它甚至没有真正被设计为索引.不过,我并不完全清楚你在寻找什么.__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__']
Run Code Online (Sandbox Code Playgroud)

一目了然你肯定是错过__mro____subclasses__.稍微复杂一点的是,有一些特殊的方法只用于碰巧构建到Python中的代码,而不是核心语言:示例包括__format__(使用者str.format)和各种ABC方法.

我甚至不知道什么__weakrefoffset__ .

请注意,Python 3有一些新东西:__prepare__metaclass shenanigans使用的方法,函数和方法现在使用魔术名称作为其属性而不是噪声im_self(参见数据模型的"用户定义函数"部分),并且一个__qualname__模块和类.

此外,进口PEP提到完全是一个模块加载器应该做的事情,包括设置一些魔法属性:__name__,__file__,__path__,__loader__,和__package__.


Vee*_*rac 8

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__
Run Code Online (Sandbox Code Playgroud)