1-
21class Example :
32 def __init__ (self , base = None , ** kwargs ):
43 # Internal storage and other attributes
@@ -16,20 +15,20 @@ def __init__(self, base=None, **kwargs):
1615
1716 # Update with provided kwargs
1817 self ._store .update (kwargs )
19-
18+
2019 def __getattr__ (self , key ):
21- if key .startswith ('__' ) and key .endswith ('__' ):
20+ if key .startswith ("__" ) and key .endswith ("__" ):
2221 raise AttributeError
2322 if key in self ._store :
2423 return self ._store [key ]
2524 raise AttributeError (f"'{ type (self ).__name__ } ' object has no attribute '{ key } '" )
2625
2726 def __setattr__ (self , key , value ):
28- if key .startswith ('_' ) or key in dir (self .__class__ ):
27+ if key .startswith ("_" ) or key in dir (self .__class__ ):
2928 super ().__setattr__ (key , value )
3029 else :
3130 self ._store [key ] = value
32-
31+
3332 def __getitem__ (self , key ):
3433 return self ._store [key ]
3534
@@ -41,55 +40,58 @@ def __delitem__(self, key):
4140
4241 def __contains__ (self , key ):
4342 return key in self ._store
44-
43+
4544 def __len__ (self ):
46- return len ([k for k in self ._store if not k .startswith (' dspy_' )])
47-
45+ return len ([k for k in self ._store if not k .startswith (" dspy_" )])
46+
4847 def __repr__ (self ):
4948 # return f"Example({self._store})" + f" (input_keys={self._input_keys}, demos={self._demos})"
50- d = {k : v for k , v in self ._store .items () if not k .startswith (' dspy_' )}
49+ d = {k : v for k , v in self ._store .items () if not k .startswith (" dspy_" )}
5150 return f"Example({ d } )" + f" (input_keys={ self ._input_keys } )"
52-
51+
5352 def __str__ (self ):
5453 return self .__repr__ ()
55-
54+
5655 def __eq__ (self , other ):
5756 return isinstance (other , Example ) and self ._store == other ._store
58-
57+
5958 def __hash__ (self ):
6059 return hash (tuple (self ._store .items ()))
6160
6261 def keys (self , include_dspy = False ):
63- return [k for k in self ._store .keys () if not k .startswith (' dspy_' ) or include_dspy ]
64-
62+ return [k for k in self ._store .keys () if not k .startswith (" dspy_" ) or include_dspy ]
63+
6564 def values (self , include_dspy = False ):
66- return [v for k , v in self ._store .items () if not k .startswith (' dspy_' ) or include_dspy ]
65+ return [v for k , v in self ._store .items () if not k .startswith (" dspy_" ) or include_dspy ]
6766
6867 def items (self , include_dspy = False ):
69- return [(k , v ) for k , v in self ._store .items () if not k .startswith (' dspy_' ) or include_dspy ]
68+ return [(k , v ) for k , v in self ._store .items () if not k .startswith (" dspy_" ) or include_dspy ]
7069
7170 def get (self , key , default = None ):
7271 return self ._store .get (key , default )
73-
72+
7473 def with_inputs (self , * keys ):
7574 copied = self .copy ()
7675 copied ._input_keys = set (keys )
7776 return copied
78-
77+
7978 def inputs (self ):
8079 if self ._input_keys is None :
8180 raise ValueError ("Inputs have not been set for this example. Use `example.with_inputs()` to set them." )
8281
8382 # return items that are in input_keys
8483 d = {key : self ._store [key ] for key in self ._store if key in self ._input_keys }
85- return type (self )(d )
86-
84+ # return type(self)(d)
85+ new_instance = type (self )(base = d )
86+ new_instance ._input_keys = self ._input_keys # Preserve input_keys in new instance
87+ return new_instance
88+
8789 def labels (self ):
8890 # return items that are NOT in input_keys
8991 input_keys = self .inputs ().keys ()
9092 d = {key : self ._store [key ] for key in self ._store if key not in input_keys }
9193 return type (self )(d )
92-
94+
9395 def __iter__ (self ):
9496 return iter (dict (self ._store ))
9597
@@ -101,6 +103,6 @@ def without(self, *keys):
101103 for key in keys :
102104 del copied [key ]
103105 return copied
104-
106+
105107 def toDict (self ):
106108 return self ._store .copy ()
0 commit comments