Стажер Python для не-строк - PullRequest
       23

Стажер Python для не-строк

8 голосов
/ 04 августа 2011

Почему Python intern встроен только для строк?Должно быть возможно расширить intern на классы, которые можно хэшировать и сравнивать, верно?

Ответы [ 3 ]

14 голосов
/ 04 августа 2011

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

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

Другие встроенные неизменяемые типы уже сравнимы в одной операции на уровне машины (int, float и т. Д.) Или в неизменяемых контейнерах, которые может содержать изменяемые значения (tuple, frozenset).Нет необходимости интернировать первого, а второго нельзя безопасно интернировать.

1 голос
/ 04 августа 2011

Нет технической причины, по которой, скажем, кортеж не мог быть интернирован, хотя я бы предположил, что в реальном мире это имеет небольшую ценность по сравнению со строковыми литералами, и это будет иметь еще меньшую ценность в реальном мире спользовательские типы.Заставить его работать, вероятно, не стоит усилий.

0 голосов
/ 04 августа 2011

Поддерживаются только строки, поскольку интернирование основано на проверке подлинности объекта на основе указателя . Хэши других типов классов можно сравнивать, но сами объекты никогда не будут соответствовать тесту идентичности. Это правда, потому что, хотя они могут быть идентичными, они не являются одинаковыми объектами.

Ссылка

...