<div><span style="font-family:menlo, consolas, courier new, monospace, sans-serif" class="font">Hello everybody!</span><br></div><div><span style="font-family:menlo, consolas, courier new, monospace, sans-serif" class="font"></span><br></div><div><span style="font-family:menlo, consolas, courier new, monospace, sans-serif" class="font">In a personnal project I feel the need (or the desire) to implement something like this:</span><br></div><div><span style="font-family:menlo, consolas, courier new, monospace, sans-serif" class="font"></span><br></div><div><span style="font-family:menlo, consolas, courier new, monospace, sans-serif" class="font">assert isinstance(1, PositiveInteger)</span><br></div><div><span style="font-family:menlo, consolas, courier new, monospace, sans-serif" class="font">assert not isinstance(-1, PositiveInteger)</span><br></div><div><span style="font-family:menlo, consolas, courier new, monospace, sans-serif" class="font"></span><br></div><div><span style="font-family:menlo, consolas, courier new, monospace, sans-serif" class="font">So I began looking a lot in the abc module, and I end unp using an __instancehook__ special method wich is called by __instancechek__ in the corresponding metaclass, just like the __subclasshook__ special method called by __subclasscheck__.</span><br></div><div><span style="font-family:menlo, consolas, courier new, monospace, sans-serif" class="font"></span><br></div><div><span style="font-family:menlo, consolas, courier new, monospace, sans-serif" class="font">The </span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;" class="font">core idea is something like this:</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;" class="font"><br></span></div><div><br></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;" class="font"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;" class="font">class MyMeta(type):</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;" class="font"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;" class="font">    def __instancecheck__(cls, instance):</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;" class="font"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;" class="font">        return cls.__instancehook__(instance)</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;" class="font"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;" class="font"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;" class="font">class PositiveInteger(metaclass=MyMeta):</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;" class="font"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;" class="font">    @classmethod</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;" class="font"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;" class="font">    def __instancehook__(cls, instance):</span><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;" class="font"><br></span></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;" class="font">        return isinstance(instance, int) and instance > 0</span><br></div><div><br></div><div><br></div><div><span style="font-family: menlo, consolas, courier new, monospace, sans-serif;" class="font">Of course, the real implemention is more detailed...</span><br></div><div><br></div><div>What do you think about that ?<br></div><div><span style="font-family:menlo, consolas, courier new, monospace, sans-serif" class="font"></span></div>