Thanks, I think this is why lambdify should not accept anything that hasn't a fixed ordering - this part of lambdify was coded too lighthearted in my opinion. So I am working on a pull request but I would like to have some discussion on what to do to make lambdify better in this sense.
At this time lambdify can give unpredictable outcome, because it accepts set and uses enumerate. That's a bug to correct in my opinion. Rightnow I have a work in progress for a pull request. I have added simple code to warn about the use of set as input, but I would like to give a more general solution to this problem. This, for instance, should warn about other types of inputs that have not fixed order. I am tempted to modify by adding specific type checks to warn when used with set, dict, but let list, OrderedDicts, sequence go through as usual. In all cases I'd let the function do the same as it has been doing so far. Any comment? On Fri, Jul 17, 2020 at 2:52 PM Jared Claypoole <[email protected]> wrote: > Hi Roberto, > > It looks like you're expecting python sets to do something they're not > intended to do. From the docs > <https://docs.python.org/3.7/library/stdtypes.html#set-types-set-frozenset>, > "A set object is an unordered collection". Of course when you iterate over > all the elements they have to come out in some order, but that's an > implementation choice. Elements are not even guaranteed to be returned in > the same order each time! (Though probably they will be.) > > I can see how one might expect enumerate to only make sense for containers > which have some guaranteed order, but that's not the way it's been designed > to work. It simply iterates over any iterable and gives you an index > counting how many elements have been seen so far*. > > In general if you want a container with guaranteed ordering, you probably > want to use a list or a tuple, or even a dict (which has had ordering > guarantees since python 3.7). You might also be interested in the answers > to this stackoverflow question on implementing an OrderedSet > <https://stackoverflow.com/q/1653970>in python. > > > * Actually one is able to change the starting value of this index from 0 > to something else, but that's somewhat beside the point. > > On Thursday, July 16, 2020 at 5:34:27 PM UTC-4, Roberto wrote: >> >> I am starting to wonder why python is so loose on this. I say "python" >> because the issue appears for enumerate as well. How can I enumerate a set? >> Still I am allowed to enumerate a set without receiving any warning. Look >> at this for instance >> >> set(["a","b"])==set(["b","a"]) >> list(enumerate(set(["a","b"]))) >> list(enumerate(set(["b","a"]))) >> import sympy as sp >> _a, _b = sp.symbols('a b') >> set([_a,_b])==set([_b,_a]) >> list(enumerate(set([_a,_b]))) >> list(enumerate(set([_b,_a]))) >> >> >> Funny enough, moving this code from one notebook to another may change >> the order in which the sets are ordered. In all cases they are ordered in >> the same way within the same notebook, but you and I running the same code >> may get different outcomes! >> I do not know if this is special with sets of sympy symbols, but I would >> have said that deep down enumerate should throw a warning when you try to >> enumerate a set. >> >> >> >> On Thursday, July 9, 2020 at 9:55:15 PM UTC+2, Aaron Meurer 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/ff8185d8-e34b-4353-82c1-0bb9fa3dd610o%40googlegroups.com > <https://groups.google.com/d/msgid/sympy/ff8185d8-e34b-4353-82c1-0bb9fa3dd610o%40googlegroups.com?utm_medium=email&utm_source=footer> > . > -- 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/CAJxM9JphNoVqnQvJqpMxCJi22O218vqa0Kj%3D_p6XpuwX1UtH0w%40mail.gmail.com.
