@@ -39,7 +39,7 @@ def __init__(
3939 ) -> None :
4040 self ._name = name
4141 self ._prefix = prefix
42- self ._default = '' if default is None else str ( default )
42+ self ._default = default
4343 self ._required = required
4444 self ._description = [line .strip () + '\n ' for line in (description or [])]
4545
@@ -80,15 +80,19 @@ def _normalize_type(self, type_hint: Any) -> ENVParsableTypes:
8080 f"Cannot register parameter '{ self ._name } ' of type '{ type_hint } '"
8181 )
8282
83- def cast (self , value : str ) -> ENVParsable :
83+ def cast (self , value : str ) -> ENVParsable | None :
8484 """
8585 Cast the string value to its type_hint.
8686 """
8787 if self ._normal_type == bool :
8888 if value .lower () in ('1' , 'true' , 'yes' ): return True
8989 if value .lower () in ('0' , 'false' , 'no' ): return False
90+ if value .lower () in ('null' , 'none' ): return None
9091 raise ValueError (f"Invalid boolean: { value } " )
9192
93+ if value == None :
94+ return None
95+
9296 return self ._normal_type (value )
9397
9498 def load_value (self ) -> ENVParsable | None :
@@ -101,9 +105,9 @@ def load_value(self) -> ENVParsable | None:
101105 self ._value = None
102106 raise ValueError (f'This env is required and can not be None: { self ._env_key } ' )
103107
104- if self ._default :
105- self ._value = self .cast ( self . _default )
106- return self .cast ( self . _default )
108+ elif self ._default :
109+ self ._value = self ._default
110+ return self ._default
107111
108112 else :
109113 self ._value = None
@@ -114,12 +118,12 @@ def load_value(self) -> ENVParsable | None:
114118
115119
116120 def __str__ (self ) -> str :
117- return f"{ self ._env_key } ={ self ._value or self ._default or '' } "
121+ return f"{ self ._env_key } ={ self ._value or self ._default if self . _default is not None else '' } "
118122
119123 def __repr__ (self ) -> str :
120124 return (
121125 f"<_Item key={ self ._env_key !r} , type={ self ._normal_type .__name__ } , "
122- f"default={ self ._default !r } , required={ self ._required } >"
126+ f"default={ self ._default if self . _default is not None else '' } , required={ self ._required } >"
123127 )
124128
125129
@@ -253,7 +257,7 @@ def decorator(func: Callable) -> Callable:
253257 section_name = class_name ,
254258 type_hint = cast .get (param .name ) if cast and param .name in cast else type_hints .get (param .name , str ),
255259 description = [line .strip () for line in doc_lines if param .name in line .lower ()],
256- default = None if param .default is inspect .Parameter .empty else str ( param .default ) ,
260+ default = None if param .default is inspect .Parameter .empty else param .default ,
257261 required = param .default is inspect .Parameter .empty ,
258262 )
259263
0 commit comments