Поскольку все, что вы делаете с аргументом type
, это сравниваете его один за другим с определенными типами, которые вы ожидаете, вместо того, чтобы фактически использовать type
для создания объектов этого типа, он не делает ничего другогоот передачи строки, такой как 'str'
или 'bool'
, в качестве аргумента и сравнения ее с несколькими строковыми константами.
Вместо этого вы можете сделать функции преобразования, такие как str2bool
и str2int
, сами по себеаргумент, так что вы можете вызвать coerce(value)
для преобразования value
в общем виде. Сохраните такие функции преобразования в качестве атрибутов выделенного класса для лучшей читаемости, как показано ниже:
import os
import typing
class to_type:
bool = 'True'.__eq__
int = int
list = lambda s: s.split(',')
def get_config(config: str, coerce: typing.Callable = lambda s: s, default: any = None):
value = os.getenv(config, None)
if value is None:
return default
return coerce(value)
os.environ["TEST_VAR"] = "True"
print(get_config("TEST_VAR", to_type.bool))
os.environ["TEST_VAR"] = "2"
print(get_config("TEST_VAR", to_type.int))
os.environ["TEST_VAR"] = "a,b,c"
print(get_config("TEST_VAR", to_type.list))
os.environ["TEST_VAR"] = "foobar"
print(get_config("TEST_VAR"))
Это выводит:
True
2
['a', 'b', 'c']
foobar