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

History