
On Thu, May 20, 2021 at 10:37 PM David Mertz <mertz@gnosis.cx> wrote:
The scenario I'm thinking about is like this:
(base) 84-tmp % python Python 3.9.1 (default, Dec 11 2020, 14:32:07) [GCC 7.3.0] :: Anaconda, Inc. on linux Type "help", "copyright", "credits" or "license" for more information.
import pickle cheap_sentinel = object() id(cheap_sentinel) 140469343429632 pickle.dump(cheap_sentinel, open('sentinel.pkl', 'wb'))
(base) 85-tmp % python Python 3.9.1 (default, Dec 11 2020, 14:32:07) [GCC 7.3.0] :: Anaconda, Inc. on linux Type "help", "copyright", "credits" or "license" for more information.
import pickle cheap_sentinel = object() id(cheap_sentinel) 139852505814016 id(pickle.load(open('sentinel.pkl', 'rb'))) 139852505813968
It would be pleasant if there were a way to make "cheap_sentinel" be the same thing—either by equality or by identity—betweeen those two runs of the interpreter.
None or Ellipsis have that property, of course. So do, for example, integers, at least by equality if not identity (yes, of course, we might get identity by interning, but it's not guaranteed).
There are several ways of achieving this for other sentinel values, some of which have been mentioned earlier in this thread. Some examples are: 1. a value from a single-valued enum 2. a class object (not an instance) 3. a singleton class with a carefully implemented __new__ which always returns the same instance - Tal Einat