@@ -95,7 +95,7 @@ def register(cls, *, exclude: Optional[List[str]] = None) -> Callable:
9595 Decorator to register class methods for env parsing.
9696
9797 Raise:
98- TypeError: if a object is not env parsable.
98+ TypeError: If an argument is not env parsable.
9999
100100 Example:
101101 >>> class APIService:
@@ -110,10 +110,9 @@ def register(cls, *, exclude: Optional[List[str]] = None) -> Callable:
110110 ) -> none:
111111 ... ...
112112
113- In this example ENVMod will create env items for each object in init except ssl_key.
113+ In this example ENVMod will create env items for each argument except ssl_key.
114114
115115 Note: Make sure you add type hints to get the same type when loading from env file.
116-
117116 """
118117 exclude = exclude or []
119118
@@ -128,7 +127,7 @@ def decorator(func: Callable) -> Callable:
128127 type_hints = get_type_hints (func )
129128
130129 for param in sig .parameters .values ():
131- if param .name == 'self' or param .name in exclude :
130+ if param .name in [ 'self' , 'cls' ] or param .name in exclude :
132131 continue
133132
134133 param_type = type_hints .get (param .name , str )
@@ -196,17 +195,21 @@ def cast(value: str, _type: Type) -> Any:
196195 if value .lower () in ('1' , 'true' , 'yes' ): return True
197196 elif value .lower () in ('0' , 'false' , 'no' ): return False
198197 else : raise ValueError (f"Casting env is not a valid bool: { value } . valid bool: '0', 'false', 'no', '1', 'true', 'yes'" )
198+
199199 return _type (value )
200200
201201 result = {}
202202 for arg , env_key in mapping .items ():
203203 value = os .environ .get (env_key )
204- if value is None :
204+ if value is None or value == '' :
205205 result [arg ] = None
206206 continue
207207
208208 result [arg ] = cast (value , types .get (arg , str ))
209209
210+ # Remove None from results
211+ result = {k : v for k , v in result .items () if v is not None }
212+
210213 return result
211214
212215 @classmethod
0 commit comments