Don't monkeypatch Expr. If you're doing that, you're either doing
something wrong, or there's something that needs to be added to SymPy.

All you need to do is define _eval_evalf, and then calling evalf on an
expression containing your subclass will call that method and use the
result.  I don't know if there is any documentation for it, but the
signature is _eval_evalf(self, prec), where prec is the precision in
decimal digits.

If you want to replace it with an exact value, rather than a numerical
value, you can define a method called doit() that returns that value.
Then call doit() on the top-level expression.

Aaron Meurer

On Wed, Jul 30, 2014 at 10:24 AM, Stewart Wadsworth
<[email protected]> wrote:
> Hello,
>
> I'm planning to use sympy for a project I'm working on and I have a few
> questions...
>
> Basically I want to be able to associate a value with a symbol and then be
> able to evaluate any function using that symbol for the value it's been
> given. This would allow me to define properties in my classes as symbolic
> functions but also be able to get the numeric value for the function at the
> value specified for each symbol.
>
> Question 1: Is there already a built in way to do this without having to
> call .subs() and .evalf() all over the place? (I'm pretty sure the answer is
> "no" but I could have overlooked something....)
>
> Question 2: If not does this seem generally useful? Like something worth
> incorporating into sympy?
>
> Question 3a: If it DOES seem like something worth incorporating: how can I
> help? (I'm somewhat new to programming and don't have any formal
> training...should I do a pull request and just do what I think is right?)
>
> Question 3b: If it DOES NOT seem like something worth incorporating: I
> implemented this functionality by creating my own Symbol class and Monkey
> patching the Expr class (copied the code below). Am I missing something
> important here? I don't think this will break sympy... Is there a better way
> to approach this? I'm a beginner so any feedback would be appreciated!
>
>
>
> CODE:
>
> class dSymbol(Symbol):
>     """
>     Add a default value to Symbols
>     """
>
>     def __new__(cls, name, value, **assumptions):
>         return super().__new__(cls, name, **assumptions)
>
>     def __init__(self, name, value, **assumptions):
>         self.default = value
>
> """
> Monkey patch the Expr class (inherited by Mul, Add,... all the function
> classes in sympy i'm interested in using)
> Add methods:
> symvalue
> value
> """
>
> def symvalue(self):
>     """
>     returns the expression evaluated at the default value for each dSymbol
>     the result is still symbolic in that pi will be displayed as 'pi' not
> '3.14159'...
>     """
>     s = self.atoms(dSymbol)
>     for i in s:
>         self = self.subs(i, i.default)
>     return self
>
> def value(self, *args, **kwargs):
>     """
>     returns the expression evaluated at the default value for each dSymbol
>     the result will be numeric (assuming it doesn't contain any 'Symbol')
>     """
>     return self.symvalue().evalf(*args, **kwargs)
>
> Expr.symvalue = symvalue
> Expr.value = value
>
> --
> 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.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/sympy/b12b7e28-aff2-4168-a3a2-c9f5ee67e1ad%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 [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sympy.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sympy/CAKgW%3D6JhzkBFir2AG4cYyR2MqJ5jowmO0FAnwSbhh_5%3DX1qFuQ%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to