<div dir="ltr"><div class="gmail_quote"><div dir="ltr">On Mon, Jun 4, 2018 at 5:39 AM Matthew Harrigan <<a href="mailto:harrigan.matthew@gmail.com">harrigan.matthew@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="auto">Should there be discussion of typing (pep-484) or abstract base classes in this nep?  Are there any requirements on the result returned by __array_function__?</div></blockquote><div><br></div><div>This is a good question that should be addressed in the NEP. Currently, we impose no limitations on the types returned by __array_function__ (or __array_ufunc__, for that matter). Given the complexity of potential __array_function__ implementations, I think this would be hard/impossible to do in general.</div><div><br></div><div>I think the best case scenario we could hope for is that type checkers would identify that result of NumPy functions as:</div><div>- numpy.ndarray if all inputs are numpy.ndarray objects</div><div>- Any if any non-numpy.ndarray inputs implement the __array_function__</div><div><br></div><div>Based on my understanding of proposed rules for typing protocols [1] and overloads [2], I think this could just work, e.g.,</div><div><br></div><div>@overload</div><div>def func(array: np.ndarray) -> np.ndarray: ...</div><div>@overload</div><div>def func(array: ImplementsArrayFunction) -> Any: ...</div><div><br></div><div>[1] <a href="https://www.python.org/dev/peps/pep-0544/">https://www.python.org/dev/peps/pep-0544/</a></div><div>[2] <a href="https://github.com/python/typing/issues/253#issuecomment-389262904">https://github.com/python/typing/issues/253#issuecomment-389262904</a><br></div></div></div>