背景:对于那些不熟悉它的人,Sublime Text (和 TextMate)通过 .tmLanguage
语言定义文件定义的范围提供语法高亮和其他功能,基本上是一堆正则表达式来识别给定语言中的各种结构,例如函数定义,各种类型字符串、保留字等。
我是 Python Improved 的维护者包(如果您有兴趣,可以通过 Package Control 获得)旨在成为 Python 的更好的语言定义。如果需要,您可以在 GitHub 上阅读它,但其中一个关键特性是它实际上得到了维护,这与许多多年未更改或更新的 Sublime 语言不同。
问题:我最近一直在关注双下划线的 __magic__
内容,并且在找到 this excellent treatise 之后由 Rafe Kettler 撰写的关于魔术功能的文章 我能够相当多地扩展语言定义的那一部分。但是,我不太幸运地找到了一个很好的内置魔法变量名列表或魔法属性,例如 __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 的知识,到目前为止我确实取得了成功,但我有点卡在了这一点上。
需要说明的是,我不是在寻找最喜欢的场外资源(尽管如果您有一个方便的链接,我将不胜感激),我也不是要开始一场固执己见的讨论。我想弄清楚的是这个列表是否按原样看起来合理,或者是否有任何明显的错误。如果你确实想要固执己见,open an issue我非常乐意讨论。
谢谢!
最佳答案
唉,数据模型文档是我能想到的最完整的东西了,它甚至还没有真正设计成索引。不过,我并不完全清楚你在寻找什么; __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__
元类恶作剧、函数和方法使用的方法现在为其属性使用魔术名称,而不是像 im_self
这样的噪音(请参阅数据模型的“用户定义函数”部分),并且有一个 __qualname__
在模块和类上。
另外,importing PEP确切地提到了模块加载器应该做什么,包括设置一些神奇的属性:__name__
, __file__
, __path__
, __loader__
, 和 __package__
.
关于python - 内置魔术变量名称/属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20340815/