One thing you can do is allow different formats of the args. The constructor does need to support the .args, but that doesn't have to be the only format it accepts. Generally, I would say that the input format should be friendly to the user and the .args format should be friendly to code that wants to walk through the expression tree and get at the parts of the expression.
An example of this is Integral. The usual syntax that the user uses for Integral is Integral(f(x, y), x, y) or Integral(f(x, y), (x, a, b), (y, c, d)). But the .args look like (f(x, y), (x,), (y,)) or (f(x, y), (x, a, b), (y, c, d)), i.e., in either case, the variables are given as tuples. Thus, for instance, the first integration variable of an integral is always integ.args[1][0], regardless of the type of the integral. If some of the args information can be computed from the rest, I would allow entering only the needed parts and then compute it all in .args. You can also allow passing in the whole thing, so that it supports the .args format, and in that case, don't recompute everything. If you do this, you should make sure that every format that you allow is unambiguous, especially in corner cases. Regarding func, you can try it. You may run into some issues of code that uses type(expr) instead of expr.func, but that code is wrong and should be changed. You'll also need to make sure that your __eq__ and __hash__ are implemented correctly. The default expr1 == expr2 iff type(expr1) == type(expr2) and expr1.args == expr2.args won't work any more. Aaron Meurer On Sun, Sep 15, 2013 at 10:44 AM, F. B. <[email protected]> wrote: > >> What is the class? Another option would be to make the super-class >> simpler. My opinion is that .args should hold all relevant information and >> other fields should compute their values from .args by properties. > > > I am working on subclassing TensorHead from the tensor module in the > GammaMatrixHead object. Both are already merged into master. GammaMatrixHead > currently cannot be reconstructed from its args, as they are the args of > TensorHead, but TensorHead args cannot be reduced, as they are required to > the tensor expressions. In the meantime, GammaMatrixHead has fixed > properties to store in TensorHead (for example, the type of its indices), so > I avoided putting them into its __new__( ) constructor. > > I was thinking of overloading the func( ) method in GammaMatrixHead, could > work? > > -- > You received this message because you are subscribed to the Google Groups > "sympy" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To post to this group, send email to [email protected]. > Visit this group at http://groups.google.com/group/sympy. > For more options, visit https://groups.google.com/groups/opt_out. -- You received this message because you are subscribed to the Google Groups "sympy" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/sympy. For more options, visit https://groups.google.com/groups/opt_out.
