It sounds like it would be a useful exercise to design a complete, modern
Traits implementation for Python 3 (maybe starting with Simoniato's
straits). An extra challenge would be to make it fit in the type system as
perceived by PEP-484-based type checkers (mypy, pyre etc.) -- without this
it would end up being a dynamically-typed dead end in Python's evolution.

On Sat, Feb 15, 2020 at 9:23 AM Stephen J. Turnbull <
turnbull.stephen...@u.tsukuba.ac.jp> wrote:

> Executive summary:
>
> I'm sorry so many people have not gotten much out of the parent
> thread.  Despite my disagreements with the OP, I find traits to be an
> interesting concept, and I'll probably try out Simionato's strait
> library[1].  I agree with several posters that traits neither need nor
> are important enough to deserve special syntax.
>
> In my previous post, I pointed out that traits conform to a slew of
> Zen that general multiple inheritance violates, and even mixins can
> only avoid with disciplined use.  I think they're worth considering if
> you use mixins as they prevent foot-shooting in some reasonably
> frequent cases.  Of course the flip side is that undisciplined use of
> mixins is not always going to put you on crutches, so YMMV.
>
> Some details follow, if I've piqued your interest.
>
> The point of traits as defined by Schärli et al is more or less that
> the support for traits respects the Zen:
>
> - Flat is better than nested.
> - Readability counts.
> - In the face of ambiguity, refuse the temptation to guess.
> - If the implementation is hard to explain, it's a bad idea.
> - Namespaces are one honking great idea -- let's do more of those!
>
> Unlike mixins, which are just a disciplined use of classes in Python,
> proper traits satisfy a "flattening" property: a class or trait
> composed from several traits behaves exactly the same as if all
> methods were defined directly in the class or composite trait,
> regardless of nesting of traits or order of addition.  If you combine
> two traits, you get a new trait.  You can still combine the new trait
> with either or both of the older ones, because the method
> implementations are the same.  (I don't know if strait implements this
> check; it may do the easy thing and just check for name conflicts.)
> To extend this property to work with class inheritance, the only
> method resolution order (MRO) you need to know for traits is: a
> definition in a class overrides a definition in a trait used by the
> class which overrides a definition in a superclass of the class.
> Composite traits aren't actually flat, and so cost some readability,
> but at least you don't need to compute the MRO.
>
> Again, unlike mixins which invoke the MRO to disambiguate methods
> defined in multiple mixins in the class hierarchy, when multiple
> traits define methods for the same name, the class using those traits
> must "refuse the temptation to guess" (even if obvious!) and
> explicitly disambiguate.  Traits improve "readability" by avoiding the
> MRO, which is "hard to explain."  Everything you need to know about
> which methods will be invoked is in the class definition, although you
> may need to read trait documentation to know all the methods
> implemented.  And as the OP points out, traits provide "namespaces"
> (so I guess we can count Uncle Tim as a vote for traits! ;-)
>
> The bottom line is that disciplined use of mixins likely provides most
> of the benefits of traits if that discipline includes a very flat
> class hierarchy and sufficient care in avoiding method name collisions.
>
> Finally, an aside on Simionato's blog post.  He claims that although
> traits are a lot safer than general multiple inheritance or even
> mixins, generic functions are "better" than traits.  I don't
> understand the interaction between generic functions and traits in
> Rust yet, but in that language they are evidently complementary
> features, not alternatives.
>
> Further reading:
>
> This tutorial on Rust (readable, although the examples are excessively
> verbose)
>
> http://gradebot.org/doc/ipur/trait.html
>
> indicates that in that language, interface definition is the primary
> purpose of a trait in (I don't take a tutorial as definitive, although
> the tutorial mirrors Soni's focus on interface), but traits are
> allowed to have default implementations of methods.  zope.interface
> interfaces deliberately avoid that; they're "pure" interfaces (at
> least where I've used them).  Nothing in any of the Rust documentation
> I looked at so far emphasizes code reuse or default implementations.
>
> I gather Rust also implements at least some "trait algebra," as
> Wikipedia describes:
>
> https://en.wikipedia.org/wiki/Trait_(computer_programming)#Characteristics
>
> After further research, I see that only "+" is implemented, and so
> far I have not been able to find documentation of whether it's
> disjoint or overriding.  Soni's post implies that if there are
> multiple implementations, one will be chosen (but any others are
> still accessible to code that knows which trait it wants).
>
> See also Fisher and Reppy for an extended treatment of trait algebra
>
> http://newtraell.cs.uchicago.edu/files/tr_authentic/TR-2003-13.pdf
>
> which cites Schärli et al, but not vice versa. The Schärli et
> paper is here:
>
> http://scg.unibe.ch/archive/papers/Scha03aTraits.pdf
>
>
> Footnotes:
> [1]  Which I keep spelling as "Simionati", mea culpa.
>      https://www.artima.com/weblogs/viewpost.jsp?thread=246488
>
> --
> Associate Professor              Division of Policy and Planning Science
> http://turnbull/sk.tsukuba.ac.jp/     Faculty of Systems and Information
> Email: turnb...@sk.tsukuba.ac.jp                   University of Tsukuba
> Tel: 029-853-5175                 Tennodai 1-1-1, Tsukuba 305-8573 JAPAN
> _______________________________________________
> Python-ideas mailing list -- python-ideas@python.org
> To unsubscribe send an email to python-ideas-le...@python.org
> https://mail.python.org/mailman3/lists/python-ideas.python.org/
> Message archived at
> https://mail.python.org/archives/list/python-ideas@python.org/message/TAKYHTLSSFIMAMYDMC6H5MZU6SF7UCPD/
> Code of Conduct: http://python.org/psf/codeofconduct/
>


-- 
--Guido van Rossum (python.org/~guido)
*Pronouns: he/him **(why is my pronoun here?)*
<http://feministing.com/2015/02/03/how-using-they-as-a-singular-pronoun-can-change-the-world/>
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/TKWXZJMWOHQPZRURAPUYPKDV2LLJDXKZ/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to