Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 16 additions & 11 deletions graphrag/config/environment_reader.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@

def read_key(value: KeyValue) -> str:
"""Read a key value."""
# In Python, isinstance check and str.lower() are fast; keep as is.
# The only micro-optimization is to pre-access the .value.lower directly to skip repeated dot access:
if not isinstance(value, str):
return value.value.lower()
return value.lower()
Expand All @@ -40,15 +42,18 @@ def env(self):

def _read_env(
self, env_key: str | list[str], default_value: T, read: Callable[[str, T], T]
) -> T | None:
) -> T | None: # type: ignore[type-arg]
# Avoid repeated isinstance and list conversion in hot loop
if isinstance(env_key, str):
env_key = [env_key]

for k in env_key:
result = read(k.upper(), default_value)
# Most lookups will be string, avoid per-iteration check
result = read(env_key.upper(), default_value)
if result is not default_value:
return result

else:
for k in env_key:
result = read(k.upper(), default_value)
if result is not default_value:
return result
return default_value

def envvar_prefix(self, prefix: KeyValue):
Expand Down Expand Up @@ -83,12 +88,12 @@ def str(
) -> str | None:
"""Read a configuration value."""
key = read_key(key)
if self.section and key in self.section:
return self.section[key]
section = getattr(self, "section", None)
if section and key in section:
return section[key]

return self._read_env(
env_key or key, default_value, (lambda k, dv: self._env(k, dv))
)
# Use a named method instead of recreating lambda on each call (saves per-call lambda allocation)
return self._read_env(env_key or key, default_value, self._env)

def int(
self,
Expand Down