If you use the free symbols as arguments, the question is, what order should they be in? As you noted, they could go in any order.
It is also not hard to do this manually. For example, lambdify(sorted(expr.free_symbols, key=str), expr) will sort the symbols in alphabetical order. Another option would be to require the symbols to be passed as keyword arguments. As long as your symbol names are valid Python variable names, lambdify will use them for the function arguments, so you can pass them as keyword arguments. For example: >>> expr = x + 2*y >>> f = lambdify(list(expr.free_symbols), expr) # list(free_symbols) could give >>> any order >>> f(x=1, y=2) 5 If you have a bunch of symbols, you can put them in a dictionary and use f(**args). Aaron Meurer On Fri, Jul 10, 2020 at 10:47 AM Oscar Benjamin <[email protected]> wrote: > > Hi Roberto, > > If you have something like > expr = some_function(args) > where some_function creates new symbols (not found in args) then > ideally some_function should also return what the newly created > symbols are or some other object that can tell you them: > expr, syms = some_function(args) > I think that attempting to guess what symbols should be used in any > context by inspecting free symbols is not a good approach. > > Oscar > > On Fri, 10 Jul 2020 at 14:28, roberto franceschini > <[email protected]> wrote: > > > > The situation is the one in which I get a sympy expression out of a > > function that ends in `return my_polynomial_inRn` and now I want to pass > > this to another function (e.g. to make plots or whatever) without having to > > know the names of the symbols involved, which is exactly what free_symbols > > does for me in this instance. > > Do you see another way around this? > > > > > > On Fri, Jul 10, 2020 at 11:08 AM Oscar Benjamin > > <[email protected]> wrote: > >> > >> Hi Roberto, > >> > >> I already answered this on SO: > >> https://stackoverflow.com/questions/62798213/keep-the-order-of-parameters-fixed-in-sympy-lambdify-from-free-symbols/62800716?noredirect=1#comment111075099_62800716 > >> > >> If you are using symarray to generate the symbols then you can get the > >> list of symbols from the symarray directly and then pass those to > >> lambdify. > >> > >> I can't think of any situation where it would be a good idea to use > >> free_symbols to get the arguments to lambdify. > >> > >> Oscar > >> > >> On Fri, 10 Jul 2020 at 08:10, roberto franceschini > >> <[email protected]> wrote: > >> > > >> > Hello, I have opened an issue for the input of lambdify. If you want to > >> > disallow sets as inputs I think it is fair. However, It would be nice to > >> > have that free_symbol can be given directly as input for lambdify, is > >> > that possible? should I use something else than free_symbols for this > >> > purpose? > >> > > >> > On Thu, Jul 9, 2020 at 9:55 PM Aaron Meurer <[email protected]> wrote: > >> >> > >> >> Can you open an issue in the issue tracker for this? I agree that sets > >> >> should not be allowed. > >> >> > >> >> Aaron Meurer > >> >> > >> >> On Thu, Jul 9, 2020 at 3:08 AM Roberto <[email protected]> > >> >> wrote: > >> >> > > >> >> > I have seen that lambdify wants a list for the arguments to be > >> >> > treated as symbols. This list can be also give as a python set, e.g. > >> >> > {x,y,z }, which is exactly what would be returned by a .free_symbol > >> >> > property. If lambdify is feed a set like that of the output of > >> >> > .free_symbol it may change their order in the conversion from set to > >> >> > list. This is done silently and may cause major disfunction in the > >> >> > use of the lamdified function because you think x is x, but is y > >> >> > instead and so on. > >> >> > I would like to ask developers to check for the type of the lambdify > >> >> > list of arguments and throw a warning to flag that a set is being > >> >> > converted and that the ordering is not guaranteed. > >> >> > Given that .free_symbols returns a set, not a list, this is very > >> >> > common pitfall in my opinion and must be prevented. > >> >> > > >> >> > -- > >> >> > 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/c1517b79-490b-4a1b-b526-3e3842b55fbco%40googlegroups.com. > >> >> > >> >> -- > >> >> 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/CAKgW%3D6KuqnjJHTObyDxK0tvaF_Frxzd-MfyQSY94v-oTUWyNAg%40mail.gmail.com. > >> > > >> > -- > >> > 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/CAJxM9JqSoqQQkYH9UUXGyXNqRtY9VHJxKByc8Fv8%2BPaqFudP6w%40mail.gmail.com. > >> > >> -- > >> 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/CAHVvXxSsngVE_X-aBRYWER5sESZW-e-EnjwWcfGAhM%3D%2Beq97zQ%40mail.gmail.com. > > > > -- > > 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/CAJxM9Jpza%3DgRk9%3DZ2_thBS4xN_dkjCaB5PTMcz1hj8wHG_R90g%40mail.gmail.com. > > -- > 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/CAHVvXxQCPtBmmcjoVKv0jqYFqezsUQ5zWox_Q16x72ygng37Xg%40mail.gmail.com. -- 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/CAKgW%3D6KepRmoA-JT5KzTB9EFx3dhnkPLyZoTqJrhsi5w%2BtWT9g%40mail.gmail.com.
