<div dir="ltr"><div class="markdown-here-wrapper" style=""><p style="margin:1.2em 0px!important">On Tue, May 16, 2017 at 5:04 PM, Guido van Rossum <<a href="mailto:gvanrossum@gmail.com" target="_blank">gvanrossum@gmail.com</a>> wrote:</p>
<p style="margin:1.2em 0px!important"></p><div class="markdown-here-exclude"><p></p><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div>What features of attrs specifically solve your use cases?<span class="gmail-HOEnZb"><font color="#888888"><br></font></span></div></blockquote><p></p></div><p style="margin:1.2em 0px!important"></p>
<p style="margin:1.2em 0px!important">(not Stephen)</p>
<p style="margin:1.2em 0px!important">I hadn’t thought about this use case:</p>
<pre style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code class="hljs language-python" style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;display:inline;white-space:pre;overflow:auto;border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important;display:block;overflow-x:auto;padding:0.5em;color:rgb(51,51,51);background-color:rgb(248,248,248);background-position:initial initial;background-repeat:initial initial">In [<span class="hljs-number" style="color:rgb(0,128,128)">1</span>]: <span class="hljs-class"><span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">class</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">C</span><span class="hljs-params">()</span>:</span>
   ...:     x = <span class="hljs-number" style="color:rgb(0,128,128)">1</span>
   ...: 
   ...:     <span class="hljs-function"><span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">def</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">__init__</span><span class="hljs-params">(self, x=None)</span>:</span>
   ...:         <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">if</span> x <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">is</span> <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">not</span> <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">None</span>:
   ...:             self.x = x
   ...: 
   ...:     <span class="hljs-function"><span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">def</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">__str__</span><span class="hljs-params">(self)</span>:</span>
   ...:         <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">return</span> <span class="hljs-string" style="color:rgb(221,17,68)">'C(%s)'</span> % self.x
   ...: 

In [<span class="hljs-number" style="color:rgb(0,128,128)">2</span>]: c1 = C()
   ...: c2 = C(<span class="hljs-number" style="color:rgb(0,128,128)">2</span>)
   ...: 

In [<span class="hljs-number" style="color:rgb(0,128,128)">3</span>]: print(c1, c2)
C(<span class="hljs-number" style="color:rgb(0,128,128)">1</span>) C(<span class="hljs-number" style="color:rgb(0,128,128)">2</span>)
</code></pre>
<p style="margin:1.2em 0px!important">And I might use it here on.</p>
<p style="margin:1.2em 0px!important">What I like about attrs is:</p>
<ul style="margin:1.2em 0px;padding-left:2em">
<li style="margin:0.5em 0px">The class level declaration of instance attributes</li>
<li style="margin:0.5em 0px">That the reasonable <strong>init</strong>, <strong>repr</strong>, and <strong>eq</strong> are generated</li>
</ul>
<p style="margin:1.2em 0px!important">I don’t like the excessive wordiness in attrs, and I don’t need “the kitchen sink” be available to have instance attributes declared at the class level. A solution based on the <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;display:inline">typing</code> module would be much better.</p>
<p style="margin:1.2em 0px!important">Basically, Python is lacking a way to declare instance fields with default values away of the initializer. Several of the mainstream OO languages (Java, Swift, Go) provide for that.</p>
<p style="margin:1.2em 0px!important">I haven’t thought much about this, except about if there’s indeed a need (and there is), but I can’t know if the solution if through decorators, or inheritance.</p>
<div title="MDH:PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEiPjxicj48ZGl2IGNsYXNzPSJnbWFpbF9xdW90ZSI+T24g
VHVlLCBNYXkgMTYsIDIwMTcgYXQgNTowNCBQTSwgR3VpZG8gdmFuIFJvc3N1bSA8c3BhbiBkaXI9
Imx0ciI+Jmx0OzxhIGhyZWY9Im1haWx0bzpndmFucm9zc3VtQGdtYWlsLmNvbSIgdGFyZ2V0PSJf
YmxhbmsiPmd2YW5yb3NzdW1AZ21haWwuY29tPC9hPiZndDs8L3NwYW4+IHdyb3RlOjxicj48Ymxv
Y2txdW90ZSBjbGFzcz0iZ21haWxfcXVvdGUiIHN0eWxlPSJtYXJnaW46IDBweCAwcHggMHB4IDAu
OGV4OyBib3JkZXItbGVmdC13aWR0aDogMXB4OyBib3JkZXItbGVmdC1zdHlsZTogc29saWQ7IGJv
cmRlci1sZWZ0LWNvbG9yOiByZ2IoMjA0LCAyMDQsIDIwNCk7IHBhZGRpbmctbGVmdDogMWV4OyI+
PGRpdj5XaGF0IGZlYXR1cmVzIG9mIGF0dHJzIHNwZWNpZmljYWxseSBzb2x2ZSB5b3VyIHVzZSBj
YXNlcz88c3BhbiBjbGFzcz0iZ21haWwtSE9FblpiIj48Zm9udCBjb2xvcj0iIzg4ODg4OCI+PGJy
PjwvZm9udD48L3NwYW4+PC9kaXY+PC9ibG9ja3F1b3RlPjwvZGl2PjxkaXYgY2xhc3M9ImdtYWls
X2V4dHJhIj48YnI+PC9kaXY+KG5vdCBTdGVwaGVuKTwvZGl2PjxkaXYgY2xhc3M9ImdtYWlsX2V4
dHJhIj48YnI+PC9kaXY+PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEiPkkgaGFkbid0IHRob3VnaHQg
YWJvdXQgdGhpcyB1c2UgY2FzZTo8L2Rpdj48ZGl2IGNsYXNzPSJnbWFpbF9leHRyYSI+PGJyPjwv
ZGl2PjxkaXYgY2xhc3M9ImdtYWlsX2V4dHJhIj5gYGBweXRob248L2Rpdj48ZGl2IGNsYXNzPSJn
bWFpbF9leHRyYSI+SW4gWzFdOiBjbGFzcyBDKCk6PC9kaXY+PGRpdiBjbGFzcz0iZ21haWxfZXh0
cmEiPiZuYnNwOyAmbmJzcDsuLi46ICZuYnNwOyAmbmJzcDsgeCA9IDE8L2Rpdj48ZGl2IGNsYXNz
PSJnbWFpbF9leHRyYSI+Jm5ic3A7ICZuYnNwOy4uLjombmJzcDs8L2Rpdj48ZGl2IGNsYXNzPSJn
bWFpbF9leHRyYSI+Jm5ic3A7ICZuYnNwOy4uLjogJm5ic3A7ICZuYnNwOyBkZWYgX19pbml0X18o
c2VsZiwgeD1Ob25lKTo8L2Rpdj48ZGl2IGNsYXNzPSJnbWFpbF9leHRyYSI+Jm5ic3A7ICZuYnNw
Oy4uLjogJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7IGlmIHggaXMgbm90IE5vbmU6PC9kaXY+
PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEiPiZuYnNwOyAmbmJzcDsuLi46ICZuYnNwOyAmbmJzcDsg
Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7IHNlbGYueCA9IHg8L2Rpdj48ZGl2IGNsYXNzPSJn
bWFpbF9leHRyYSI+Jm5ic3A7ICZuYnNwOy4uLjombmJzcDs8L2Rpdj48ZGl2IGNsYXNzPSJnbWFp
bF9leHRyYSI+Jm5ic3A7ICZuYnNwOy4uLjogJm5ic3A7ICZuYnNwOyBkZWYgX19zdHJfXyhzZWxm
KTo8L2Rpdj48ZGl2IGNsYXNzPSJnbWFpbF9leHRyYSI+Jm5ic3A7ICZuYnNwOy4uLjogJm5ic3A7
ICZuYnNwOyAmbmJzcDsgJm5ic3A7IHJldHVybiAnQyglcyknICUgc2VsZi54PC9kaXY+PGRpdiBj
bGFzcz0iZ21haWxfZXh0cmEiPiZuYnNwOyAmbmJzcDsuLi46Jm5ic3A7PC9kaXY+PGRpdiBjbGFz
cz0iZ21haWxfZXh0cmEiPjxicj48L2Rpdj48ZGl2IGNsYXNzPSJnbWFpbF9leHRyYSI+SW4gWzJd
OiBjMSA9IEMoKTwvZGl2PjxkaXYgY2xhc3M9ImdtYWlsX2V4dHJhIj4mbmJzcDsgJm5ic3A7Li4u
OiBjMiA9IEMoMik8L2Rpdj48ZGl2IGNsYXNzPSJnbWFpbF9leHRyYSI+Jm5ic3A7ICZuYnNwOy4u
LjombmJzcDs8L2Rpdj48ZGl2IGNsYXNzPSJnbWFpbF9leHRyYSI+PGJyPjwvZGl2PjxkaXYgY2xh
c3M9ImdtYWlsX2V4dHJhIj5JbiBbM106IHByaW50KGMxLCBjMik8L2Rpdj48ZGl2IGNsYXNzPSJn
bWFpbF9leHRyYSI+QygxKSBDKDIpPC9kaXY+PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEiPmBgYDwv
ZGl2PjxkaXYgY2xhc3M9ImdtYWlsX2V4dHJhIj48YnI+PC9kaXY+PGRpdiBjbGFzcz0iZ21haWxf
ZXh0cmEiPkFuZCBJIG1pZ2h0IHVzZSBpdCBoZXJlIG9uLjxicj48L2Rpdj48ZGl2IGNsYXNzPSJn
bWFpbF9leHRyYSI+PGRpdj48YnI+PC9kaXY+PGRpdj5XaGF0IEkgbGlrZSBhYm91dCBhdHRycyBp
czo8L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PiogVGhlIGNsYXNzIGxldmVsIGRlY2xhcmF0aW9u
IG9mIGluc3RhbmNlIGF0dHJpYnV0ZXM8YnI+KiBUaGF0IHRoZSByZWFzb25hYmxlIF9faW5pdF9f
LCBfX3JlcHJfXywgYW5kIF9fZXFfXyBhcmUgZ2VuZXJhdGVkPGJyPjxkaXY+PGJyPjwvZGl2Pjxk
aXY+SSBkb24ndCBsaWtlIHRoZSBleGNlc3NpdmUgd29yZGluZXNzIGluIGF0dHJzLCBhbmQgSSBk
b24ndCBuZWVkICJ0aGUga2l0Y2hlbiBzaW5rIiBiZSBhdmFpbGFibGUgdG8gaGF2ZSBpbnN0YW5j
ZSBhdHRyaWJ1dGVzIGRlY2xhcmVkIGF0IHRoZSBjbGFzcyBsZXZlbC4gQSBzb2x1dGlvbiBiYXNl
ZCBvbiB0aGUgYHR5cGluZ2AgbW9kdWxlIHdvdWxkIGJlIG11Y2ggYmV0dGVyLjwvZGl2PjwvZGl2
PjxkaXY+PGJyPjwvZGl2PjxkaXY+QmFzaWNhbGx5LCBQeXRob24gaXMgbGFja2luZyBhIHdheSB0
byBkZWNsYXJlIGluc3RhbmNlIGZpZWxkcyB3aXRoIGRlZmF1bHQgdmFsdWVzIGF3YXkgb2YgdGhl
IGluaXRpYWxpemVyLiBTZXZlcmFsIG9mIHRoZSBtYWluc3RyZWFtIE9PIGxhbmd1YWdlcyAoSmF2
YSwgU3dpZnQsIEdvKSBwcm92aWRlIGZvciB0aGF0LjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+
SSBoYXZlbid0IHRob3VnaHQgbXVjaCBhYm91dCB0aGlzLCBleGNlcHQgYWJvdXQgaWYgdGhlcmUn
cyBpbmRlZWQgYSBuZWVkIChhbmQgdGhlcmUgaXMpLCBidXQgSSBjYW4ndCBrbm93IGlmIHRoZSBz
b2x1dGlvbiBpZiB0aHJvdWdoIGRlY29yYXRvcnMsIG9yIGluaGVyaXRhbmNlLjwvZGl2PjwvZGl2
PjxkaXYgY2xhc3M9ImdtYWlsX2V4dHJhIj48ZGl2Pjxicj48L2Rpdj48L2Rpdj4=" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0">​</div></div><div class="gmail_extra gmail-markdown-here-signature markdown-here-signature">-- <br><div class="gmail_signature"><span style="color:rgb(0,102,0)">Juancarlo </span><b style="color:rgb(0,102,0)">Añez</b></div>
</div></div>