Henry, did you get any further with this? I have often missed this kind of object, I usually keep track of the values of constants in a dictionary and perform xreplace before calling e.g. lambdify. But using a ConstantSymbol along the lines which you have described would make the code much cleaner.

## Advertising

Looking a bit further, I think a natural next step would then be to pre-define symbols for the natural constants in sympy.physics.units, e.g.: Avogadro_constant = ConstantSymbol('N_A', avogadro_number/mol) using objects like this with lambdify would then require the user to choose a system of units (e.g. SI, imperial units, etc) at invocation of `lambdify`. The callback returned by lambdify would then assume nondimensionalised input in the chosen unit system (which means that the user would likely appreciate having a corresponding nondimensionalising-callback for work with input carrying units). Best, Björn On Thursday, 31 March 2016 17:46:50 UTC+2, Aaron Meurer wrote: > > Sure, it sounds useful. > > I think the assumptions should mirror the assumptions of self.value > (currently, Floats set is_rational to None), which I believe is > intentional. > > For lambdify, I suppose LambdaPrinter ought to define its own print > method. That might break existing code that expects it to use str, so > we should make sure it falls back. > > Aaron Meurer > > > On Thu, Mar 31, 2016 at 11:13 AM, Henry Schreiner > <henrysch...@gmail.com <javascript:>> wrote: > > Is there a way to make a constant symbol in Sympy? I haven't found one > yet. > > Basically, it would be a lot like pi and other constants, but you could > make > > your own. In other words, > > > >>>> c = ConstantSymbol('c', 1.23) > >>>> c + 1 > > c+1 > >>>> _.evalf() > > 2.23 > > > > That way, formulas could stay in a nice form until evaluation occurs. > Also, > > subs will still allow changing out constants. > > > > Here's example code that does that: > > > > class ConstantSymbol(s.NumberSymbol): > > is_real = True > > is_irrational = False > > is_algebraic = True > > __slots__ = ['name', 'value'] > > > > def __new__(cls, name, value): > > self = super(ConstantSymbol,cls).__new__(cls) > > self.name=name > > self.value=s.Float(value) > > > > return self > > > > def __getnewargs__(self): > > return (self.name,self.value) > > > > def _latex(self, printer): > > return printer.doprint(s.Symbol(self.name)) > > > > def _sympystr(self, printer): > > return printer.doprint(s.Symbol(self.name)) > > > > def _sympyrepr(self, printer): > > return printer.doprint(s.Symbol(self.name)) > > > > def _mathml(self, printer): > > return printer.doprint(s.Symbol(self.name)) > > > > def _as_mpf_val(self, prec): > > return self.value._as_mpf_val(price) > > > > > > The problem with the above code is that sympy.lamdify uses _sympystr() > > instead of evaluating it first. > > > > > > Is there something like this, or would something like this be useful? > > > > -- > > 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 sympy+un...@googlegroups.com <javascript:>. > > To post to this group, send email to sy...@googlegroups.com > <javascript:>. > > Visit this group at https://groups.google.com/group/sympy. > > To view this discussion on the web visit > > > https://groups.google.com/d/msgid/sympy/c5ac54f3-1012-4bc9-86d4-88a7740ce27b%40googlegroups.com. > > > > For more options, visit https://groups.google.com/d/optout. > -- 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 sympy+unsubscr...@googlegroups.com. To post to this group, send email to sympy@googlegroups.com. Visit this group at https://groups.google.com/group/sympy. To view this discussion on the web visit https://groups.google.com/d/msgid/sympy/4e5ac282-845e-4458-968e-f72d64a5379f%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.