如何正确检查环境变量的可用性



我做了一个令牌检查,如果至少缺少一个令牌,"True"将不会。现在我需要推断出缺少了哪个变量,该怎么做?

PRACTICUM_TOKEN = os.getenv('PRACTICUM_TOKEN')
TELEGRAM_TOKEN = os.getenv('TELEGRAM_TOKEN')
TELEGRAM_CHAT_ID = os.getenv('TELEGRAM_CHAT_ID')

def check_tokens():
"""Checks the availability of environment variables."""
ENV_VARS = [PRACTICUM_TOKEN, TELEGRAM_TOKEN, TELEGRAM_CHAT_ID]
if not all(ENV_VARS):
print('Required environment variables are missing:', ...)
else:
return True

我可能建议将这些值放在类中。check tokens方法可以是类的一部分,并且您可以使用__dict__动态获取对您定义的所有token的引用,而不必重复代码。

class Environment:
def __init__(self):
self.PRACTICUM_TOKEN = os.getenv('PRACTICUM_TOKEN')
self.TELEGRAM_TOKEN = os.getenv('TELEGRAM_TOKEN')
self.TELEGRAM_CHAT_ID = os.getenv('TELEGRAM_CHAT_ID')
def check_tokens(self):
"""Checks the availability of environment variables."""
missing_vars = [var for var, value in self.__dict__.items() if not value]
if missing_vars:
print('Required environment variables are missing:', *missing_vars)
return False
else:
return True
print(Environment().check_tokens())

对代码的最小调整:

PRACTICUM_TOKEN = os.getenv('PRACTICUM_TOKEN')
TELEGRAM_TOKEN = os.getenv('TELEGRAM_TOKEN')
TELEGRAM_CHAT_ID = os.getenv('TELEGRAM_CHAT_ID')
ENV_VARS = ['PRACTICUM_TOKEN', 'TELEGRAM_TOKEN', 'TELEGRAM_CHAT_ID']

def check_tokens():
"""Checks the availability of environment variables."""
undefined_vars = set(filter(lambda v: globals().get(v) is not None,
ENV_VARS))
if not undefined_vars:
return True
print(f"Required environment variables are missing: {undefined_vars}")
return False

但我讨厌写FOO = bar('FOO')这样的行,所以这里有一种更复杂的方法,部分灵感来自薄片答案:

class Environment:
env_vars = ['PRACTICUM_TOKEN', 'TELEGRAM_TOKEN', 'TELEGRAM_CHAT_ID']
def __init__(self):
for var in self.env_vars:
setattr(self, var, os.getenv(var))

def check_tokens(e):
"""checks the availability of environment variables."""
undefined_vars = set(filter(lambda v: not getattr(e, v), e.env_vars))
if not undefined_vars:
return True
print(f"Required environment variables are missing: {undefined_vars}")
return False

env = Environment()
check_tokens(env)
$ TELEGRAM_TOKEN=1 python3 envvars.py
Required environment variables are missing: {'TELEGRAM_CHAT_ID', 'PRACTICUM_TOKEN'}

最新更新