Есть ли причина, по которой учебник SQLAlchemy ORM ставит угловые скобки вокруг своих значений repr?



Учебник SQLAlchemy ORM использует этот класс:



>>> from sqlalchemy import Column, Integer, String
>>> class User(Base):
... __tablename__ = 'users'
...
... id = Column(Integer, primary_key=True)
... name = Column(String)
... fullname = Column(String)
... password = Column(String)
...
... def __init__(self, name, fullname, password):
... self.name = name
... self.fullname = fullname
... self.password = password
...
... def __repr__(self):
... return "<User('%s','%s', '%s')>" % (self.name, self.fullname, self.password)


Зачем вам тратить столько усилий на то, чтобы иметь строку, которая будет хорошо работать, когда eval()'d, только чтобы нарушить эту функциональность, но окружить ее угловыми скобками?



Я понимаю, что идиома eval(repr(foo)) далеко не единственная цель __repr__, но все равно кажется странным, как она кажется намеренно отключенной здесь. Есть ли в этом какая-то большая логика, которую я упускаю, или это просто какое-то произвольное решение?

577   3  

3 ответов:

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

Другими словами, не было никакого сознательного решения, чтобы разорвать eval(repr(x)) здесь. Просто принято ставить угловые скобки вокруг вывода __repr__.

Соглашение об угловых скобках используется самим интерпретатором Python, так что это скорее вопрос ...ГВР ?

>>> class Foo(object):
...     pass
... 
>>> f = Foo()
>>> print repr(f)
<__main__.Foo object at 0x1004ab290>

Один из аргументов в пользу угловых скобок заключается в семантике. В то время как eval(repr(2)) is 2 все время eval(repr(23094823589710L)) is not 23094823589710L, и я не верю, что eval(repr(myinstance)) is instance будет истинно вообще для экземпляров mapper классов. Поддерживается ли идентичность и равенство таким образом, может даже зависеть от наличия уникальных ограничений или других свойств класса.

Другой проблемой является доступность класса в пространстве имен. Если определенный класс не попадает в область видимости, eval(repr(x)) вызовет NameError.

A более сложный пример: я написал свою собственную библиотечную функцию (метакласс), которая принимает имя таблицы в виде строки, динамически создает класс, используя type в качестве конструктора и mapper, который уже предоставляет __init__, __str__ и __repr__ методы, и возвращает новый класс. Все такие классы имеют одинаковые атрибуты __name__, поэтому невозможно поддерживать eval(repr(x)) is x или даже eval(repr(x)) == x в моей библиотечной функции. Поэтому я использую угловые скобки для repr в этих классах.

Моя ставка заключается в том, что по этим причинам и возможно, в других документах используются угловые скобки, чтобы избежать ожидания, что eval(repr(x)) is x всегда будет поддерживаться.

Comments

    Ничего не найдено.