Как работает Лен? - PullRequest
       24

Как работает Лен?

3 голосов
/ 31 января 2010

Как работает len на Python?

Посмотрите на этот пример:

class INT(int):
    pass

class STR(str):

    def __len__(self):
        return INT(42)

q = STR('how').__len__()
print q, type(q)
q = len(STR('how'))
print q, type(q)

Вывод:

42 <class '__main__.INT'>
42 <type 'int'>

Как я могу справиться с этим, чтобы len возвращал экземпляр INT?

Ответы показывают, что единственным решением является переопределение len

Это моя альтернативная реализация. Это не кажется очень вредным.

original_len = len
def len(o):
    l = o.__len__()
    if isinstance(l, int):
        return l
    original_len(o)

Ответы [ 4 ]

4 голосов
/ 31 января 2010

Не делай этого. Вы должны учиться, когда лучший ответ на самом деле не делать то, что вы пытаетесь делать вообще. Это один из тех времен.

3 голосов
/ 31 января 2010

Вы не сможете. По крайней мере, если вы хотите, чтобы он работал с остальной частью Python. См. определение len

Вызывается для реализации встроенного функция len (). Должен вернуть длина объекта, целое число> = 0 . Кроме того, объект, который не определяет ненулевой () метод, чей метод len () возвращает ноль, считается логическим в логическом контекст.

Курсив выделен моим.

3 голосов
/ 31 января 2010

Не думаю, что вы можете, если вы не напишите свой собственный лен. Встроенный лен всегда возвращает int.

2 голосов
/ 31 января 2010

Как говорят другие, не делай этого. Посмотрите, как будет выглядеть использование этого класса:

length = len(s)     # the reader assumes `q` is an int.
length.in_yards()   # the reader is going WTF?!

Вместо того, чтобы нарушать ожидания читателя, почему бы вам просто не добавить другой метод:

s.length_in_yards()

P.S. Не решает этот вопрос, но если у вас есть веская причина для написания пользовательских целочисленных объектов, вас может заинтересовать специальный метод __index__, который позволяет напрямую использовать такой объект для индексирования последовательности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...