Могу ли я переопределить отображение списка Python? - PullRequest
3 голосов
/ 26 сентября 2010

Я бы хотел изменить поведение отображений списка Python, чтобы вместо list они создавали подкласс list, который я написал.(Примечание: я не думаю, что это хорошая идея; я делаю это для развлечения, а не для реального использования.)

Вот что я сделал:

old_list = list

class CallableList(old_list):
    def __init__(self, *args):
        old_list.__init__(self)
        for arg in args:
            self.append(arg)
    def __call__(self, start, end=None):
        if end:
            return self[start:end]
        return self[start]

list = CallableList

Однаждыэто сделано, это возвращает третий элемент списка:

x = list(1, 2, 3)
print x(2)

, но все равно выдает ошибку:

x = [1, 2, 3]
print x(2)

Ошибка довольно проста:

Traceback (most recent call last):
  File "list_test.py", line 23, in <module>
    print x(2)
TypeError: 'list' object is not callable

Я думаю, что, вероятно, нет способа сделать это, но я не могу найти ничего, что говорит так однозначно.Есть идеи?

Ответы [ 3 ]

3 голосов
/ 26 сентября 2010

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

1 голос
/ 26 сентября 2010

Вы не можете изменить его из Python. Такие конструкции, как списочные выражения, всегда используют встроенный тип списка, а не то, для чего вы определили слово list в текущем пространстве имен. Если вы хотите изменить встроенный тип, вы должны отредактировать исходный код Python и перекомпилировать. Предполагая, что вы используете реализацию CPython, он находится в Objects / listobject.c .

0 голосов
/ 26 сентября 2010
   >>> print(x(2)) # works in 2.7
   3
   >>> type(x)
   <class '__main__.CallableList'>
   >>> y = [1,2,3]
   >>> type(y)
   <type 'list'>

, так что вы на самом деле не переопределили тип 'list', вы только изменили свое пространство имен, так что метод list () списка типов теперь конфликтует с типом CallableList вашего типа.Чтобы избежать этого,

   >>> fred = CallableList
   >>> type(fred)
   <type 'type'>
   >>> x = fred(1,2,3)
   >>> x
   [1, 2, 3]
   >>> print x(2)
   3
   >>> 
...