Ответ 1
Вы думаете, что есть правила?
Единственным правилом для интернирования является то, что возвращаемое значение intern
интернировано. Все остальное зависит от капризов того, кто решил, что какой-то фрагмент кода должен или не должен делать интернирование. Например, "left"
получает интернированный PyCodeNew
:
/* Intern selected string constants */
for (i = PyTuple_GET_SIZE(consts); --i >= 0; ) {
PyObject *v = PyTuple_GetItem(consts, i);
if (!all_name_chars(v))
continue;
PyUnicode_InternInPlace(&PyTuple_GET_ITEM(consts, i));
}
"Правило" здесь состоит в том, что строковый объект в co_consts
объекта кода Python получает интернированный, если он состоит исключительно из символов ASCII, которые являются законными в идентификаторе Python. "left"
получает интернированный, но "as,df"
не будет, а "1234"
будет интернирован, даже если идентификатор не может начинаться с цифры. Хотя идентификаторы могут содержать символы, отличные от ASCII, эти символы по-прежнему отклоняются этой проверкой. Фактические идентификаторы никогда не проходят через этот код; они получают безоговорочно интернированные несколько строк, ASCII или нет. Этот код может быть изменен, и есть много других кодов, которые делают интернированные или интернирующие вещи.
Просить нас о "правилах" для интернирования строк, как просить метеоролога о том, что такое правила, идет ли дождь на вашей свадьбе. Мы можем рассказать вам довольно много о том, как это работает, но вам это не будет очень полезно, и вы всегда будете получать сюрпризы.