@@ -12,7 +12,7 @@ class UnnamedDataFrame(DataFrame):
1212 def __init__ (self ,
1313 key_names : Optional [Union [str , list [str ]]]= None ,
1414 value_names : Optional [Union [str , list [str ]]]= None ,
15- save_filename : Optional [str ]= None ,
15+ name : Optional [str ]= None ,
1616 default_value : Optional [Any ]= None ,
1717 last_only : bool = False ,
1818 * args ,
@@ -22,15 +22,14 @@ def __init__(self,
2222 super ().__init__ (* args , ** kwargs )
2323 to_list = lambda l : [l ] if isinstance (l , str ) else l
2424 self .meta = SimpleNamespace ()
25- self .meta .save_filename = save_filename
25+ self .meta .name = name
2626 self .meta .key_names , self .meta .value_names = to_list (key_names ), to_list (value_names )
2727 assert isinstance (self .key_names , list ) or not self .key_names
2828 assert isinstance (self .value_names , list ) or not self .value_names
2929 columns = sum ([ n if n else list () for n in (self .key_names , self .value_names ) ], list ())
3030 for column in columns :
3131 if column not in self .columns :
3232 self [column ] = float ("nan" )
33- self .meta .save_filename = save_filename
3433 self .meta ._default_value = default_value
3534 self .meta ._last_only = last_only
3635
@@ -42,19 +41,16 @@ def key_names(self):
4241 def value_names (self ):
4342 return self .meta .value_names
4443
45- @property
46- def save_filename (self ):
47- return self .meta .save_filename
48-
4944 """ The following methods could be worth redefining in derived classes """
45+ @property
5046 def default_value (self ) -> Any :
5147 return self .meta ._default_value
5248
5349 def value2row (self , value : Optional [Any ]= None , ** kwargs ) -> Series :
5450 if value is None :
5551 value = dict ()
5652 elif isinstance (value , (dict , Series )):
57- value = dict ( value )
53+ value = { key : v for key , v in value . items () }
5854 elif isinstance (value , Iterable ):
5955 value = { self .value_names [index ]: v for index , v in enumerate (value ) }
6056 else :
@@ -73,7 +69,7 @@ def row2value(self, row: Series) -> Any:
7369 return row
7470 if len (self .value_names ) == 1 :
7571 return row [self .value_names [0 ]]
76- return [ row [name ] for name in self .value_names ]
72+ return tuple ( row [name ] for name in self .value_names )
7773
7874 def df2value (self , df : DataFrame , last_only : Optional [bool ]= None ) -> Any :
7975 last_only = self .meta ._last_only if last_only is None else last_only
@@ -84,30 +80,33 @@ def df2value(self, df: DataFrame, last_only: Optional[bool]=None) -> Any:
8480 """ The following methods are are more standard """
8581 def add_row (self , value : Optional [Any ]= None , ** kwargs ) -> None :
8682 self .index = list (range (len (self )))
87- self .loc [len (self )] = self .value2row (value , ** kwargs ) if value else Series (kwargs )
83+ kwargs = { k : (str (v ) if k in self .key_names else v ) for k , v in kwargs .items () }
84+ self .loc [len (self )] = Series (kwargs ) if value is None else self .value2row (value , ** kwargs )
8885
8986 def get (self ,
9087 * args ,
9188 process : bool = True ,
9289 last_only : Optional [bool ]= None ,
9390 ** kwargs
94- ) -> "UnnamedDataFrame" :
91+ ) -> Union [ "UnnamedDataFrame" , tuple ] :
9592 assert len (args ) <= len (self .key_names )
9693 assert all ({ key not in self .key_names [:len (args )] for key in kwargs })
97- kwargs |= { key : value for key , value in zip (self .key_names [:len (args )], args ) }
94+ kwargs = { k : str (v ) for k , v in kwargs .items () }
95+ kwargs |= { key : str (value ) for key , value in zip (self .key_names [:len (args )], args ) }
9896 df = self [reduce (lambda a , x : a & x , [ self [k ] == v for k , v in kwargs .items () ], True )]
9997 key_names = [ n for n in self .key_names if n not in kwargs ]
10098 if key_names or not process :
10199 return type (self )(df , key_names = key_names )
102- return self .default_value () if df .empty else self .df2value (df , last_only )
100+ return self .default_value if df .empty else self .df2value (df , last_only )
103101
104- def __contains__ (self , ** kwargs ) -> bool :
105- return not self .get (** kwargs ).empty
102+ def __contains__ (self , * args , * *kwargs ) -> bool :
103+ return not self .get (* args , * *kwargs ).empty
106104
107105 def set (self , value : Optional [Any ]= None , * args , ** kwargs ) -> None :
108106 assert len (args ) <= len (self .key_names )
109107 assert all ({ key not in self .key_names [:len (args )] for key in kwargs })
110- kwargs |= { k : v for k , v in zip (self .key_names [:len (args )], args ) }
108+ kwargs = { k : str (v ) for k , v in kwargs .items () }
109+ kwargs |= { k : str (v ) for k , v in zip (self .key_names [:len (args )], args ) }
111110 df = self .get (process = False , ** kwargs )
112111 if df .empty :
113112 self .add_row (value , ** kwargs )
@@ -155,8 +154,8 @@ def values(self, process: bool=True) -> list:
155154 return [ value for _ , value in self ]
156155
157156 def save (self , directory : Union [str , Path ]) -> tuple [str , str ]:
158- assert self .save_filename is not None , f"{ type (self ).__name__ } has no save filename"
159- path = Path (directory ) / self .save_filename
157+ assert self .meta . name is not None , f"{ type (self ).__name__ } has no save filename"
158+ path = Path (directory ) / f" { self .meta . name } .csv"
160159 self .to_csv (path , index = False )
161160 return type (self ).__name__ , str (path )
162161
0 commit comments