You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
We currently do the following check for _require_ordered_input:
if (
self._require_ordered_input
and not (isinstance(items, Sequence) or isinstance(items, ImmutableSet))
and not self._order_key
):
raise ValueError(
"Builder has require_ordered_input on, but provided collection "
"is neither a sequence or another ImmutableSet. A common cause "
"of this is initializing an ImmutableSet from a set literal; "
"prefer to initialize from a list instead to help preserve "
"determinism."
)
In #12, @rgabbard and I discussed some of the challenges in determining whether the input is ordered. We decided to change the flag to disable_order_check, and have the order check look for specific bad classes as sources. Specifically:
A set that is not an ImmutableSet
Dictionaries or dictionary views that come from unordered dictionaries.
Note in particular that things like itertools.chain don't return generators, which blocks us from whitelisting Generator to cover all these cases. So we decided to switch to a blacklisting approach where we block AbstractSet-derived classes which are not ImmutableSet and also KeysView, ValuesView, and ItemsView coming from built-in dicts on Python versions/implementations not guaranteeing deterministic iteration ordering. This should hit most of the common cases. We will allow disabling this check via a disable_order_check flag.
For KeysView, etc., we propose a hack: at module initialization we will make a dummy dict and cache the class of the returned views. We will then use these in the checks. These will be deterministic for Python 3.7+ and on Python 3.6 with the CPython implementation. This may be a little brittle, but since you can always override it we don't think it is too big of a problem.
We currently do the following check for
_require_ordered_input
:In #12, @rgabbard and I discussed some of the challenges in determining whether the input is ordered. We decided to change the flag to
disable_order_check
, and have the order check look for specific bad classes as sources. Specifically:ImmutableSet
Regarding 2, @rgabbard said before:
@rgabbard Anything you want to add?
The text was updated successfully, but these errors were encountered: