[Python-Dev] PEP 520: Ordered Class Definition Namespace (original) (raw)
Nikita Nemkin nikita at nemkin.ru
Thu Jun 16 07:11:33 EDT 2016
- Previous message (by thread): [Python-Dev] PEP 520: Ordered Class Definition Namespace
- Next message (by thread): [Python-Dev] PEP 520: Ordered Class Definition Namespace
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
I'll reformulate my argument:
Ordered class namespaces are a minority use case that's already covered by existing language features (custom metaclasses) and doesn't warrant the extension of the language (i.e. making OrderedDict a builtin type). This is about Python-the-Language, not CPython-the-runtime.
If you disagree with this premise, there's no point arguing about the alternatives. That being said, below are the answers to your objections to specific alternatives.
On Thu, Jun 16, 2016 at 1:30 AM, Nick Coghlan <ncoghlan at gmail.com> wrote:
On 14 June 2016 at 02:41, Nikita Nemkin <nikita at nemkin.ru> wrote:
Adding metaclasses to an existing class can break compatibility with third party subclasses, so making it possible for people to avoid that while still gaining the ability to implicitly expose attribute ordering to class decorators and other potentially interested parties is a recurring theme behind this PEP and also PEPs 422 and 487.
The simple answer is "don't do that", i.e. don't pile an ordered metaclass on top of another metaclass. Such use case is hypothetical anyway.
Also, namespace argument to the default metaclass doesn't cause conflicts.
3. Making compiler fill in definitionorder for every class (just like qualname) without touching the runtime. ? Class scopes support conditionals and loops, so we can't necessarily be sure what names will be assigned without running the code. It's also possible to make attribute assignments via locals() that are entirely opaque to the compiler, but visible to the interpreter at runtime.
All explicit assignments in the class body can be detected statically. Implicit assignments via locals(), sys._frame() etc. can't be detected, BUT they are unlikely to have a meaningful order! It's reasonable to exclude them from definition_order.
This also applies to documentation tools. If there really was a need, they could have easily extracted static order, solving 99.9999% of the problem.
The rationale for "Why not make this configurable, rather than switching it unilaterally?" is that it's actually simpler overall to just make it the default - we can then change the documentation to say "class bodies are evaluated in a collections.OrderedDict instance by default" and record the consequences of that, rather than having to document yet another class customisation mechanism.
It would have been a "simpler" default if it was the core dict that became ordered. Instead, it brings in a 3rd party (OrderedDict).
Documenting an extra metaclass or an extra type kward would hardly take more space. And it's NOT yet another mechanism. It's the good old metaclass mechanism.
It also eliminates boilerplate from class decorator usage instructions, where people have to write "to use this class decorator, you must also specify 'namespace=collections.OrderedDict' in your class header"
Statically inferred definition_order would work here. Order-dependent decorators don't seem to be important enough to worry about their usability.
- Previous message (by thread): [Python-Dev] PEP 520: Ordered Class Definition Namespace
- Next message (by thread): [Python-Dev] PEP 520: Ordered Class Definition Namespace
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]