Clarify None handling in sglang's environ (#15770)
This commit is contained in:
@@ -11,9 +11,8 @@ class EnvField:
|
|||||||
|
|
||||||
def __init__(self, default: Any):
|
def __init__(self, default: Any):
|
||||||
self.default = default
|
self.default = default
|
||||||
# NOTE: we use None to indicate whether the value is set or not
|
# NOTE: environ can only accept str values, so we need a flag to indicate
|
||||||
# If the value is manually set to None, we need mark it as _set_to_none.
|
# whether the env var is explicitly set to None.
|
||||||
# Always use clear() to reset the value, which leads to the default fallback.
|
|
||||||
self._set_to_none = False
|
self._set_to_none = False
|
||||||
|
|
||||||
def __set_name__(self, owner, name):
|
def __set_name__(self, owner, name):
|
||||||
@@ -25,10 +24,13 @@ class EnvField:
|
|||||||
|
|
||||||
def get(self) -> Any:
|
def get(self) -> Any:
|
||||||
value = os.getenv(self.name)
|
value = os.getenv(self.name)
|
||||||
|
|
||||||
|
# Explicitly set to None
|
||||||
if self._set_to_none:
|
if self._set_to_none:
|
||||||
assert value is None
|
assert value == str(None)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
# Not set, return default
|
||||||
if value is None:
|
if value is None:
|
||||||
return self.default
|
return self.default
|
||||||
|
|
||||||
@@ -41,20 +43,11 @@ class EnvField:
|
|||||||
return self.default
|
return self.default
|
||||||
|
|
||||||
def is_set(self):
|
def is_set(self):
|
||||||
# NOTE: If None is manually set, it is considered as set.
|
return self.name in os.environ
|
||||||
return self.name in os.environ or self._set_to_none
|
|
||||||
|
|
||||||
def get_set_value_or(self, or_value: Any):
|
|
||||||
# NOTE: Ugly usage, but only way to get custom default value.
|
|
||||||
return self.get() if self.is_set() else or_value
|
|
||||||
|
|
||||||
def set(self, value: Any):
|
def set(self, value: Any):
|
||||||
if value is None:
|
self._set_to_none = value is None
|
||||||
self._set_to_none = True
|
os.environ[self.name] = str(value)
|
||||||
os.environ.pop(self.name, None)
|
|
||||||
else:
|
|
||||||
self._set_to_none = False
|
|
||||||
os.environ[self.name] = str(value)
|
|
||||||
|
|
||||||
@contextmanager
|
@contextmanager
|
||||||
def override(self, value: Any):
|
def override(self, value: Any):
|
||||||
|
|||||||
Reference in New Issue
Block a user