A few comments: - You should wrap the float in a string, so that you don't lose precision from Python's float. - Why have you made __abs__ a staticmethod? Also, SymPy's Abs uses _eval_Abs. But you won't need it anyway, because you've defined it to be positive. - To get printing, you need to define the printing methods. See http://docs.sympy.org/latest/modules/printing.html. You need to define the "printmethod" for each printer that you care about. The most common ones are the string printer, the ASCII pretty printer, the Unicode pretty printer, and the LaTeX printer. If you want it to work with lambdify() you'll need to use the LambdaPrinter. If you want it to work with the code generation you'll need to define the relevant printer for the languages you are interested in. - Making it a Singleton is not required. This is done in SymPy for efficiency purposes. Neither is setting __slots__ to []. They shouldn't hurt either way, though. If you want your code to work in Python 3 you'll need to use with_metaclass. - Defining __int__ shouldn't be necessary. If it is, that's a bug, because the superclass should have that defined in such a way that it figures it out automatically from the evalf() value.
Aaron Meurer On Sun, Feb 2, 2014 at 8:12 PM, G B <[email protected]> wrote: > Ok, I tried this and it seems to behave well at a basic level: > > from sympy.core.singleton import Singleton > class BoltzmannConstant(NumberSymbol): > __metaclass__ = Singleton > > > is_real = True > is_positive = True > is_negative = False > is_irrational = None > > > __slots__ = [] > > > @staticmethod > def __abs__(): > return S.BoltzmannConstant > > > def __int__(self): > return 0 > > > def _eval_evalf(self,prec): > return N(1.3806488e-23,prec) > > kB = S.BoltzmannConstant > > > Does that look like a reasonable implementation? > > How would I associate the symbol "k_B" with this Singleton? Right now when > I enter kB, it displays as 'BoltzmannConstant()' (whereas pi somehow knows > to display as \pi). > > > > On Sunday, February 2, 2014 5:40:21 PM UTC-8, Aaron Meurer wrote: >> >> I don't think pi and Exp1 are good examples because they are already >> implemented in mpmath, and can be computed to an arbitrary number of >> digits. That's what the mpf stuff is doing. For your case, I think you >> just need to define _eval_evalf(self, prec), which should return a >> Float to prec digits. >> >> _sage_ is just to convert the objects to Sage equivalents. If you >> don't intend for you code to ever be used within Sage you don't need >> to worry about it. >> >> Aaron Meurer >> >> On Sun, Feb 2, 2014 at 7:12 PM, G B <[email protected]> wrote: >> > I'd like to set up values that display as symbols but evaluate to >> > numbers >> > when called with .n(). I think this is similar to how pi and E are >> > handled. >> > In my case it's constants such as the speed of light, and Boltzmann's >> > constant. When I look at the symbolic representation, I'd like to see >> > these >> > values represented as symbols (c, k_B), but when I evaluate I'd like >> > their >> > true value used without the need for explicit substitution. >> > >> > Is there an easy way to set up such values? >> > >> > Looking through the source, I found Pi and Exp1 defined in >> > sympy.core.numbers-- and it looks like each is a custom class. Is there >> > a >> > trick to setting up _as_mpf_val and approximation_interval for physical >> > constants such as these? Does _sage_ need to be implemented if I'm not >> > running within Sage? >> > >> > Thanks-- >> > Greg >> > >> > -- >> > 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. -- 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.
