Присвойте значение, равное только себе - PullRequest
1 голос
/ 09 февраля 2010

Я хочу присвоить переменной («константе») значение, которое позволит этой переменной только когда-либо возвращать True в is и == сравнениях с собой.

Я хочу избежать присвоения произвольного значения, такого как int или какого-либо другого типа, при вероятности того, что выбранное мной значение вступит в конфликт с каким-либо другим.

Я рассматриваю возможность создания экземпляра класса, который использует уникальность значений id() CPython в любых сравнениях, которые может поддерживать это значение.

С здесь :

If no __cmp__(), __eq__()  or __ne__()  operation is defined, class instances are compared by object identity (“address”).

Предполагается, что:

MY_CONSTANT = object()

Только когда-либо вернет true в сравнении с MY_CONSTANT в реализации CPython, если MY_CONSTANT каким-то образом был собран сборщиком мусора, и что-то еще размещено на его месте во время сравнения (я бы предположил, вероятно, никогда не случится).

Ответы [ 2 ]

1 голос
/ 09 февраля 2010

Да. Это хороший способ определения уникальных констант. Конечно, существует минимальный риск того, что любой объект, который вы сравниваете, определяется как равный всему, но если все играют достаточно хорошо, это должно сработать. Кроме того, проблема сборки мусора не будет проблемой, потому что, если это когда-либо случится, ваша константа уже исчезла и не может сравниться с новым объектом с тем же идентификатором.

0 голосов
/ 09 февраля 2010

Пока MY_CONSTANT остается в области видимости, объект, на который он ссылается, не может быть подвергнут сборке мусора. Вы действительно должны всегда использовать is для сравнения, поскольку поведение == может быть переопределено

...