On Sun, 7 Feb 2021 at 00:07, David Bailey <[email protected]> wrote:
>
> Dear Group,
>
> While thinking about Jonathon's question, I came across this oddity:
>
> x=symbols('x')
>
> f=symbols('f',cls=Function)
>
> diff(f,x)
>
> 1
>
> Why 1? I think I would have expected it to generate a TypeError, just like
> f+x does.
The problem is that an undefined function like f is actually a class.
An object like f(x) is an instance of that class. When you do diff(f,
x) that calls through to f.diff(x). The f class has a diff method but
it is supposed to be called with an instance. Instead if you just call
f.diff(x) then the diff method is called with x as the instance so
what you get is equivalent to x.diff() which is treated as x.diff(x)
which gives 1.
It's like this:
In [10]: class MyExpr(Expr):
...: def diff(self, *symbols):
...: print('self =', self)
...: print('symbols =', symbols)
...:
In [11]: diff(MyExpr, x)
self = x
symbols = ()
In [12]: diff(MyExpr(y), x)
self = MyExpr(y)
symbols = (x,)
Ideally we should change it so that an undefined function like f is a
Basic instance rather than a Basic subclass.
Oscar
--
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 view this discussion on the web visit
https://groups.google.com/d/msgid/sympy/CAHVvXxTZUVfp6La93BuCsD-04PYcSeCS-so%3DzrBcx5g_jru04Q%40mail.gmail.com.