Нужен простой способ добавить метаинформацию / класс в переменную списка / кортежа Python? - PullRequest
3 голосов
/ 09 марта 2011

All

Я хочу, чтобы простая мета-информация была заключена в объект списка, см. Код ниже.

>>> a = []
>>> a.foo = 100
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
AttributeError: 'list' object has no attribute 'foo'
>>> setattr(a,"foo",100)
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
AttributeError: 'list' object has no attribute 'foo'
>>> dir(a)
...
 '__setattr__',
 '__setitem__',
...

мои вопросы

  1. почему я не могу использовать setattr () для переменной "a", поскольку в списке уже должна быть функция ' setattr '?

  2. Есть ли простой способ присоединить метаинформацию к переменной list / tuple вместо перегрузки ' setattr ' или встроить этот список в dict?

спасибо!

Ответы [ 2 ]

5 голосов
/ 09 марта 2011

Базовые типы, определенные в C, не могут иметь произвольных добавленных атрибутов; вы должны извлечь из них тип Python, чтобы изменить это.

>>> class MyList(list):
...   pass
... 
>>> m = MyList((1, 2, 3))
>>> len(m)
3
>>> m.foo = 42
>>> m.foo
42
1 голос
/ 09 марта 2011
  1. it имеет setattr. не имеет атрибут 'foo', как говорится в сообщении.
  2. да, подкласс, например,

class mylist(list):
 pass

l = mylist()
l.foo = 'bar'
...