Currently mypy applies the rule that things like __iter__ = None block protocol implementation. However, it is applied only to dunder attributes, which is too ad-hoc (also there are names like send and throw in collections.abc). It is proposed in python/typing#464 that it should be applied only to methods (callable members) which would be more consistent.