Как я могу использовать `str.format` напрямую как`__repr__`?

Скажем, я хочу отладить простой класс с атрибутом myattribute, Я создаю repr метод как это:

class SimpleClass:
  def __repr__(self):
    return "{0.myattribute}".format(self)

Это немного излишне, поэтому я бы предпочел использовать format непосредственно:

class SimpleClass:
  __repr__ = "{0.myattribute}".format

... но это не с IndexError: tuple index out of range, Я понимаю, что format не может получить доступ к self аргумент, но я не понимаю, почему.

Я делаю что-то не так, это ограничение CPython - или что еще?

1 ответ

Решение

"{0.myattribute}".format это уже связанный метод для строкового объекта ("{0.myattribute}"). Поэтому, когда вызывающий код пытается найти, скажем, x.__repr__ (где x это SimpleClass экземпляр), Python находит __repr__ атрибут SimpleClass, но затем не может распознать его как SimpleClass метод - протокол дескриптора не соблюдается (строковый метод не имеет __get__ атрибуты).

Похоже, что в 3.4, используя lambda будет работать, хотя я мог поклясться, что это должно было быть реальной функцией в предыдущих версиях. functools.partial не будет работать. Но вы все равно должны использовать настоящую функцию. Извините, это не так СУХО, как вам бы хотелось.

Другие вопросы по тегам