关于类属性的命名约定,PEP 8表示:
__ double_leading_and_trailing_underscore__:" magic"生活在用户控制的命名空间中的对象或属性。例如。 __init __,__ import__或__file__。不要发明这样的名字;只能按照文件记录使用它们。
这是否意味着永远不会使用此约定或仅在用户控制的命名空间中使用。"
我已经在其他库中使用过这种方法,而这些库并没有直接包含在Python中。根据我的收集,使用此约定更具体地实现API。
有几个例子是在Pyramid中为类提供__acl__,或者在SQLAlchemy中为类添加__tablename__。
在API OK的上下文中使用此约定,还是只应该为Python使用/保留它?
答案 0 :(得分:2)
Pyramid和SQLAlchemy不遵守不发明这些名字的指示。
我不清楚你在API"的背景下使用这个约定是什么意思,但是一旦他们发明了这个名字,你就不会这样做有很多选择,但可以按照他们的记录使用它。
您发明此类名称与仅在用户控制的名称空间中发明它们之间没有区别。由于您是Python的用户,因此您可以将名称放入的任何命名空间都是由用户控制的。如果您正在修改Python源代码,则需要为需要某些" magic"的语言添加新的扩展名。名称,然后你可以发明一个。我希望如果你这样做,你通常会以这种或那种方式与GvR沟通,所以你可以直接问他的意见: - )
这里发生的事情是图书馆作者想要一个名字,他们的用户不会偶然使用这个名字来表示别的东西。 Python语言也希望用户不会偶然使用的名称代表其他东西,因此它会预留"语言使用的特定格式的名称。但后来图书馆作家决定“偷”"其中一个保留名称并且无论如何都要使用它,因为他们认为这是避免与其中一个用户发生冲突的最佳方法。他们有成千上万的用户,他们中的大多数人对此一无所知。但是只有一种Python语言规范,他们可以访问它。因此,如果发生冲突,库开发人员会知道它,这是正面的,但这将是他们的错,很难修复,这是负面的。
也许他们希望通过使用它,事实上为自己保留它,并且GvR将选择永远不会使用流行库已经使用过的名称。或者也许他们已经在相关的邮件列表上讨论了它并获得了通常规则的例外 - 我不知道是否有一个流程。