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.

Reply via email to