Going back to TensorProduct, this is what I get in my branch: In [58]: TensorProduct(x, y + z).expand() Out[58]: x⋅y⋅1⨂ 1 + x⋅z⋅1⨂ 1
(I hope you mean the TensorProduct in sympy.physics.quantum). Is that what you would expect? If, not, could you be more explicit about what you are asking? On Wed, Jul 18, 2012 at 4:44 PM, [email protected] <[email protected]> wrote: >> It uses is_Atom for the base case. > > Why is is_Atom preferable to (not hasattr(obj, 'args') or not obj.args)? > Is not is_Atom redundant (i.e. mostly the same as args==(,)), and with > limited scope (i.e. breaks when args contain non-Basic)? It works just fine with non-Basic args (I know this for a fact because I had to make it work for OracleGate, which has a lambda in its args). Let me go ahead and paste what I've been using: def _eval_expand_hint(self, deep=True, **hints): if not deep or self.is_Atom: return self sargs, terms = self.args, [] for term in sargs: if hasattr(term, "_eval_expand_hint"): newterm = term._eval_expand_hint(deep=deep, **hints) else: newterm = term terms.append(newterm) return self.func(*terms) This is defined on Expr for each hint (actually a little more generally using __getattr__, but that's external to the discussion). I *suppose* self.is_Atom could be replaced with not self.args. I'm not sure what the benefits of either way are. I do know there are classes with empty .args that are not Atoms (like Tuple()). I don't know of any classes that are recursion base cases but don't have args. I think the key point about Atom is not that it has empty .args, but that it has empty .args *and* it cannot be rebuilt from it's args (the empty args part is only because this only works if it is always a leaf in the expression tree). So Tuple().args == () but Tuple.is_Atom == False is fine because Tuple(*()) == Tuple() holds. But Symbol(*()) == Symbol('x') or Rational(*()) == Rational(1, 2) do not hold. Note however that there's no way that .is_Atom or .args could not be defined, because this is defined on Expr, so any class that uses it will be a subclass of Expr and will have those properties. Aaron Meurer -- You received this message because you are subscribed to the Google Groups "sympy" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/sympy?hl=en.
