Comments 6
хорошо когда дерево однозначно складывается.
А если будут несколько возможных источников данных, тогда куда ?
Можете привести конкретный пример? В нашем случае точка входа всегда одна - это целевой метод, а аргументов может быть несколько. Такой пример есть в статье, см. calc_avg(p: 'price_list', l: 'num_days')
ну в примерах - это понятно, они простые и понятные.
но если например вы пишете обменник валют и у вас есть:
def exchg_rate_a(from: "bolivar") -> "euro":
...
def exchg_rate_b(from: "bolivar") -> "usd":
...
def exchg_rate_c(from: "euro") -> "rupia":
...
def exchg_rate_d(from: "usd") -> "rupia":
...
какое дерево будет построено для того чтобы быть переданным сюда
def exchg_rate_my(from: "rupia") -> "dinar":
...
для переменной с аннотацией 'bolivar' ?
Понятно, спасибо за пример! Такие сценарии поддерживаются, но требуют явной директивы от пользователя, например через декоратор:
def exchg_rate_a(from: "bolivar") -> "euro":
...
def exchg_rate_b(from: "bolivar") -> "usd":
...
@polimer.mark(proxy_currency="euro")
def exchg_rate_c(from: "euro") -> "rupia":
...
@polimer.mark(proxy_currency="usd")
def exchg_rate_d(from: "usd") -> "rupia":
Тогда пользователь может указать желаемый путь конвертации аргументом к exchg_rate_my(from: "rupia", proxy_currency = "usd") -> "dinar"
, либо по умолчанию будет выбран первый подходящий путь (в данном случае euro).
Полагаю, вы хотели бы искать оптимальный путь конвертации автоматически исходя из некоторой целевой функции (напр. минимизация издержек на конвертацию), но рассмотрение такого подхода заслуживает отдельной статьи! Можем записать в список пожеланий на будущее.
А может все лучше использовать ast.Ast вместо ispect, для получения всего, что необходимо?
Вторая идея - модно же использовать кеширующий декоратор, он сработает на момент первого вызова функции. проверит тип, вызовет нужную функцию и запомнит на следующие вызовы.
Хорошая идея, но мы старались не усложнять туториал, поэтому использовали inspect.
Кстати, изначально фреймворк был реализован на декораторах, но потом мы отказались от такого подхода, потому что он требует более глубокой интеграции - нужно явно импортировать декоратор и прописать его перед всеми методами. А аннотации не так сильно перегружают код и их можно задавать без фреймворка.
По поводу кеширование запишем в список улучшений на будущее!
Изобретаем polimer — фреймворк на Python для ускорения разработки научных прототипов