I’m +0 on removing it, so mostly neutral, but slightly in favour. While I see the argument for having it, I also see it as a violation of DRY... The information is already available in relevant arguments.
I doubt any people implementing this protocol are going to be lazy enough not to implement a type check. So far, we’ve been good on __array_ufunc__. The part of me that says it’s good to have it is the mostly “squeeze every bit of performance out” part. Best Regards Hameer Abbasi Sent from my iPhone > On 21. Aug 2018, at 10:34, Marten van Kerkwijk <m.h.vankerkw...@gmail.com> > wrote: > > >> >> I don't really understand the 'types' frozenset. The NEP says "it will >> >> be used by most __array_function__ methods, which otherwise would need >> >> to extract this information themselves"... but they still need to >> >> extract the information themselves, because they still have to examine >> >> each object and figure out what type it is. And, simply creating a >> >> frozenset costs ~0.2 µs on my laptop, which is overhead that we can't >> >> possibly optimize later... >> > >> > >> > The most flexible alternative would be to just say that we provide an >> > fixed-length iterable, and return a tuple object. (In my microbenchmarks, >> > it's faster to make a tuple than a list or set.) In an early draft of the >> > NEP, I proposed exactly this, but the speed difference seemed really >> > marginal to me. >> > >> > I included 'types' in the interface because I really do think it's >> > something >> > that almost all __array_function__ implementations should use use. It >> > preserves a nice separation of concerns between dispatching logic and >> > implementations for a new type. At least as long as __array_function__ is >> > experimental, I don't think we should be encouraging people to write >> > functions that could return NotImplemented directly and to rely entirely on >> > the NumPy interface. >> > >> > Many but not all implementations will need to look at argument types. This >> > is only really essential for cases where mixed operations between NumPy >> > arrays and another type are allowed. If you only implement the NumPy >> > interface for MyArray objects, then in the usual Python style you wouldn't >> > need isinstance checks. >> > >> > It's also important from an ecosystem perspective. If we don't make it easy >> > to get type information, my guess is that many __array_function__ authors >> > wouldn't bother to return NotImplemented for unexpected types, which means >> > that __array_function__ will break in weird ways when used with objects >> > from >> > unrelated libraries. >> >> This is much more of a detail as compared to the rest of the >> discussion, so I don't want to quibble too much about it. (Especially >> since if we keep things really-provisional, we can change our mind >> about the argument later :-).) Mostly I'm just confused, because there >> are lots of __dunder__ functions in Python (and NumPy), and none of >> them take a special 'types' argument... so what's special about >> __array_function__ that makes it necessary/worthwhile? >> >> Any implementation of, say, concatenate-via-array_function is going to >> involve iterating through all the arguments and looking at each of >> them to figure out what kind of object it is and how to handle it, >> right? That's true whether or not they've done a "pre-check" using the >> types set, so in theory it's just as easy to return NotImplemented at >> that point. But I guess your point in the last paragraph is that this >> means there will be lots of chances to mess up the >> NotImplemented-returning code in particular, especially since it's >> less likely to be tested than the happy path, which seems plausible. >> So basically the point of the types set is to let people factor out >> that little bit of lots of functions into one common place? I guess >> some careful devs might be unhappy with paying extra so that other >> lazier devs can get away with being lazy, but maybe it's a good >> tradeoff for us (esp. since as numpy devs, we'll be getting the bug >> reports regardless :-)). >> >> If that's the goal, then it does make me wonder if there might be a >> more direct way to accomplish it -- like, should we let classes define >> an __array_function_types__ attribute that numpy would check before >> even trying to dispatch to __array_function__? >> > I quite like that idea; I've not been enchanted by the extra `types` either - > it seems like `method` in `__array_ufunc__`, it could become quite > superfluous. > > -- Marten > _______________________________________________ > NumPy-Discussion mailing list > NumPy-Discussion@python.org > https://mail.python.org/mailman/listinfo/numpy-discussion
_______________________________________________ NumPy-Discussion mailing list NumPy-Discussion@python.org https://mail.python.org/mailman/listinfo/numpy-discussion