你认为有规则吗?
实习的唯一规则是 的返回值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 代码对象中的字符串对象纯粹由 Python 标识符中合法的 ASCII 字符组成,则它会被保留。"left"
被实习,但"as,df"
不会,"1234"
即使标识符不能以数字开头,也会被实习。虽然标识符可以包含非 ASCII 字符,但此类字符仍会被此检查拒绝。实际标识符永远不会通过此代码;他们无条件地被拘留了几行,ASCII 与否。这段代码可能会发生变化,还有很多其他代码可以做实习或类似实习的事情。
向我们询问字符串实习的“规则”就像向气象学家询问婚礼是否下雨的规则是什么。我们可以告诉你很多关于它是如何工作的,但它对你没有多大用处,而且你总会得到惊喜。