Jython возвращает False для gettattr ([alist], '__ reversed__'), а Python возвращает True - PullRequest
0 голосов
/ 16 августа 2010

Отлаживая, почему cmd2 не загружается в Jython, я обнаружил, что он ломается, потому что Jython возвращает False в gettattr([alist],'__reversed__'), а Python возвращает True.

Я бы предположил, что верным результатом является True, поскольку список является обратимым.

Кто-нибудь знает, что происходит?

мой следующий вариант - просмотреть исходники Jython ... и я не жду этого;)

Кстати, я использую jython 2.5.1 поверх java "1.6.0_18" в ubuntu

Спасибо заранее за любые подсказки

1 Ответ

2 голосов
/ 27 сентября 2010

Похоже, что атрибут __reversed__ списков в Jython не реализован.Я не получаю результаты, которые вы описываете, если я звоню

getattr([], '__reversed__')

в Python 2.5.2, я получаю

>>> [].__reversed__
<built-in method __reversed__ of list object at 0x7f72581d7050>

И в Jython 2.5.1 я получаю

>>> [].__reversed__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute '__reversed__'

Если он возвращает True или False соответственно, то, вероятно, вы не используете стандартный список Python.

В любом случае, похоже, что Jython не поддерживаетатрибут __reversed__ списков, указывающий, что он обратим.Согласно документации эта функция, кажется, была добавлена ​​к реализации CPython в Python 2.6, что может объяснить, почему она не появилась в Jython 2.5.1.Я нахожу, что __reversed__ появляется в Python 2.5.2, поэтому он может быть перенесен обратно в CPython, но просто официально не поддерживается.

На данный момент, вы можете предложить, чтобы cmd2 был исправлен примерно следующим:

def can_be_reversed(o):
    "return True if an object can be reversed by reverse()"
    return hasattr(o, '__reversed__') or \
        hasattr(o, '__len__') and hasattr(o, '__getitem__')
...