<div dir="ltr"><div><div>TBH I've found the numeric tower a questionable addition to 
Python's stdlib. For PEP 484 we decided not to use it (using the 
concrete types, int, float etc. instead). So I'm not excited about 
adding more like this, especially since essentially *everything* can be 
used in a Boolean context.<br><br></div>If your specific project has a 
specific style requirement for Booleans that would be helped by a 
Boolean ABC, maybe you should add it to your project and see how it 
works out, and after a few months report back here.<br><br></div>Finally. How were you planning to use this new ABC?<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Feb 12, 2018 at 1:41 AM, Sylvain MARIE <span dir="ltr"><<a href="mailto:sylvain.marie@schneider-electric.com" target="_blank">sylvain.marie@schneider-electric.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">





<div link="#0563C1" vlink="#954F72" lang="FR">
<div class="m_-8307735254666074730WordSection1">
<p class="MsoNormal"><span lang="EN-US">The numbers module provides very useful ABC for the ‘numeric tower’, able to abstract away the differences between python primitives and for example numpy primitives.<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">I could not find any equivalent for Booleans.<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">However numpy defines np.bool too, so being able to have an abstract Boolean class for both python bool and numpy bool would be great.<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">Here is a version that I included in valid8 in the meantime<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">-----------------------<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">class Boolean(metaclass=ABCMeta):<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">    """<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">    An abstract base class for booleans, similar to what is available in numbers<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">    see <a href="https://docs.python.org/3.5/library/numbers.html" target="_blank">https://docs.python.org/3.5/<wbr>library/numbers.html</a><u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">    """<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">    __slots__ = ()<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">    @abstractmethod<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">    def __bool__(self):<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">        """Return a builtin bool instance. Called for bool(self)."""<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">    @abstractmethod<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">    def __and__(self, other):<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">        """self & other"""<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">    @abstractmethod<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">    def __rand__(self, other):<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">        """other & self"""<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">    @abstractmethod<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">    def __xor__(self, other):<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">        """self ^ other"""<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">    @abstractmethod<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">    def __rxor__(self, other):<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">        """other ^ self"""<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">    @abstractmethod<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">    def __or__(self, other):<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">        """self | other"""<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">    @abstractmethod<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">    def __ror__(self, other):<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">        """other | self"""<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">    @abstractmethod<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">    def __invert__(self):<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">        """~self"""<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="EN-US"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="EN-US"># register bool and numpy bool_ as virtual subclasses<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US"># so that issubclass(bool, Boolean) = issubclass(np.bool_, Boolean) = True<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">Boolean.register(bool)<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">try:<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">    import numpy as np<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">    Boolean.register(np.bool_)<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">except ImportError:<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">    # silently escape<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">    pass<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">---------------------------<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">If that topic was already discussed and settled in the past, please ignore this thread – apologies for not being able to find it.
<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">Best regards<span class="HOEnZb"><font color="#888888"><u></u><u></u></font></span></span></p><span class="HOEnZb"><font color="#888888">
<p class="MsoNormal"><span lang="EN-US"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">Sylvain</span><span lang="EN-US"><u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US"><u></u> <u></u></span></p>
</font></span></div>
</div>

<br>______________________________<wbr>_________________<br>
Python-ideas mailing list<br>
<a href="mailto:Python-ideas@python.org">Python-ideas@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/python-ideas" rel="noreferrer" target="_blank">https://mail.python.org/<wbr>mailman/listinfo/python-ideas</a><br>
Code of Conduct: <a href="http://python.org/psf/codeofconduct/" rel="noreferrer" target="_blank">http://python.org/psf/<wbr>codeofconduct/</a><br>
<br></blockquote></div><br><br clear="all"><br>-- <br><div class="gmail_signature" data-smartmail="gmail_signature">--Guido van Rossum (<a href="http://python.org/~guido" target="_blank">python.org/~guido</a>)</div>
</div>