Один аргумент для угловых скобок заключается в семантике.В то время как eval(repr(2)) is 2
все время, eval(repr(23094823589710L)) is not 23094823589710L
, и я не верю, что eval(repr(myinstance)) is instance
будет в общем случае истинно для экземпляров mapper
классов.То, поддерживаются ли идентичность и равенство таким образом, может даже зависеть от наличия уникальных ограничений или других свойств класса.
Другая проблема - это доступность класса в пространстве имен.Если конкретный класс окажется вне области действия, eval(repr(x))
вызовет NameError
.
Более сложный пример: я написал свою собственную библиотечную функцию (метакласс), которая принимает имя таблицы в виде строки, динамически создает класс, используя type
в качестве конструктора и mapper
, который уже предоставляет методы __init__
, __str__
и __repr__
, и возвращает новый класс.Все такие классы имеют идентичные атрибуты __name__
, поэтому невозможно поддерживать eval(repr(x)) is x
или даже eval(repr(x)) == x
в моей библиотечной функции.Поэтому в этих классах я использую угловые скобки для repr
.
Моя ставка, по этим и, возможно, другим причинам, в документации используются угловые скобки, чтобы избежать ожидания того, что eval(repr(x)) is x
всегда будет поддерживаться.