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.

Reply via email to