Следующий код иллюстрирует исходную ситуацию, которую я хочу улучшить:
# expensive function execution returning a value
def f(x:int):
print(f"f({x})")
return 2*x
# the value is to be stored globally
gvar = f(3)
# this function uses the global variable
def g():
doing_something_with(gvar)
return
Прежде всего я не хочу, чтобы gvar
устанавливался немедленно, но при первом использовании ( отложенная загрузка):
gvar = None
def g():
gvar = f(3)
doing_something_with(gvar)
return
Но я также не хочу, чтобы gvar
устанавливался при каждом его использовании:
gvar = None
def g():
if gvar is None:
gvar = f(3)
doing_something_with(gvar)
return
И, наконец, я хочу, чтобы это произошло настолько прозрачно, насколько это возможно - результат должен быть примерно таким:
gvar = magic(f, 3)
def g():
doing_something_with(gvar)
return
Так что я могу просто использовать gvar
, как если бы это была нормальная переменная, в то время как она фактически невидимо инкапсулирует механизм, который будет лениво загружать ее значение.
Так что, если я позвоню g
несколько раз:
g() # prints f(3)
g() # -
g() # -
Возможно ли это?
Чтобы дать вам дополнительный контекст. Практическим сценарием является служба FastApi, где g()
будет представлять путь. Некоторые из этих функций работы с путями могут использовать одну и ту же глобальную переменную, которую следует использовать только один раз. Чтобы сделать шаблон более пригодным для повторного использования и подключения, я бы хотел, чтобы ленивая загрузка происходила прозрачно.