Welcome, guest | Sign In | My Account | Store | Cart
```class L(list):
"""
A subclass of list that can accept additional attributes.
Should be able to be used just like a regular list.

The problem:
a = [1, 2, 4, 8]
a.x = "Hey!" # AttributeError: 'list' object has no attribute 'x'

The solution:
a = L(1, 2, 4, 8)
a.x = "Hey!"
print a       # [1, 2, 4, 8]
print a.x     # "Hey!"
print len(a)  # 4

You can also do these:
a = L( 1, 2, 4, 8 , x="Hey!" )                 # [1, 2, 4, 8]
a = L( 1, 2, 4, 8 )( x="Hey!" )                # [1, 2, 4, 8]
a = L( [1, 2, 4, 8] , x="Hey!" )               # [1, 2, 4, 8]
a = L( {1, 2, 4, 8} , x="Hey!" )               # [1, 2, 4, 8]
a = L( [2 ** b for b in range(4)] , x="Hey!" ) # [1, 2, 4, 8]
a = L( (2 ** b for b in range(4)) , x="Hey!" ) # [1, 2, 4, 8]
a = L( 2 ** b for b in range(4) )( x="Hey!" )  # [1, 2, 4, 8]
a = L( 2 )                                     # [2]
"""
def __new__(self, *args, **kwargs):
return super(L, self).__new__(self, args, kwargs)

def __init__(self, *args, **kwargs):
if len(args) == 1 and hasattr(args[0], '__iter__'):
list.__init__(self, args[0])
else:
list.__init__(self, args)
self.__dict__.update(kwargs)

def __call__(self, **kwargs):
self.__dict__.update(kwargs)
return self
```

#### Diff to Previous Revision

```--- revision 2 2015-09-29 16:17:24
+++ revision 3 2015-09-29 16:28:46
@@ -16,10 +16,12 @@

You can also do these:
a = L( 1, 2, 4, 8 , x="Hey!" )                 # [1, 2, 4, 8]
+    a = L( 1, 2, 4, 8 )( x="Hey!" )                # [1, 2, 4, 8]
a = L( [1, 2, 4, 8] , x="Hey!" )               # [1, 2, 4, 8]
a = L( {1, 2, 4, 8} , x="Hey!" )               # [1, 2, 4, 8]
+    a = L( [2 ** b for b in range(4)] , x="Hey!" ) # [1, 2, 4, 8]
a = L( (2 ** b for b in range(4)) , x="Hey!" ) # [1, 2, 4, 8]
-    a = L( [2 ** b for b in range(4)] , x="Hey!" ) # [1, 2, 4, 8]
+    a = L( 2 ** b for b in range(4) )( x="Hey!" )  # [1, 2, 4, 8]
a = L( 2 )                                     # [2]
"""
def __new__(self, *args, **kwargs):
@@ -31,3 +33,7 @@
else:
list.__init__(self, args)
self.__dict__.update(kwargs)
+
+    def __call__(self, **kwargs):
+        self.__dict__.update(kwargs)
+        return self
```