FYI https://github.com/sympy/sympy/pull/19792
On Fri, Jul 17, 2020 at 3:27 PM roberto franceschini < [email protected]> wrote: > 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/CAJxM9JoLYHPtVvDLi2sucgYPVYj5YknBPnHn%2BOf39VnSvh6t-g%40mail.gmail.com.
