Является ли str ("str") всегда тождественной функцией? - PullRequest
4 голосов
/ 25 июня 2019

Вот такой простой вопрос:

Я вижу для некоторых объектов, что вызов str может реально создать ссылку на новый объект

>>> a = 1
>>> str(a) is str(a)
False

Однако я заметил, что это не так для строк (что кажется интуитивно понятным). Всегда ли метод str действует как функция тождественности для объектов str? Или это свойство только кажется правильным из-за оптимизации интернирования строк и может фактически не возвращать ту же ссылку?

>>> a = "1"
>>> a is str(a)
True
>>> str(a) is str(a)
True

Это глобальное правило спецификации правила / языка или оно будет зависеть от интерпретатора?

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

def safeguard_foo(val):
    foo(str(val))

Другим вариантом является обеспечение более многословной защиты (стоит отметить, что этот метод в любом случае работает примерно на 25% быстрее, поэтому с точки зрения производительности он выигрывает даже до рассмотрения вопросов, связанных с созданием мусора). например, * * 1 022

def safeguard_foo(val):
    if not isinstance(val, str):
        val = str(val)
    foo(val)
...