>
> So is there a good reason to either a) not have f be Basic or b) not let
> Tuple hold functions like f (and not discriminate against them in a has
> query)?
>
a) To me it seems strange that f is not Basic (Lambda is an Expr for
instance). Moreover if we want the recursively evaluated Expr from
another thread here on the mailing list, we need f to be Expr
b) There is already "has not supported for non-Basic without
_has_matcher". So we have defined the interface we want. On the other
hand, it is not pythonic (as far as I understand it, I might be wrong)
to force the user to subclass Basic in order to work with sympy.
More generally, I do not understand why we want everything to be
Basic. The only argument that I hear is "in order to rebuild the
expressions". But rebuilding uses `type(object)(object.args)`, Why
should we force the use of Basic in addition to that. If an object has
.args we rebuild it as shown. If not we either raise an error or copy
it (copying is much better as it allows having strings in args - just
check every class that has a 'name' attribute to see how useful this
would be).