У меня есть несколько сценариев, которые, по сути, являются этапами подготовки данных для настройки данных для имитационных моделей. Я очень часто хочу запускать только его части, скажем, «фаза1» или «фаза2», но большинство «фаз» занимают более одной строки, поэтому комментировать не очень удобно. Так я обычно делаю:
# Phase 1
if True:
do_step_1('high')
do_step_2()
for i in range(1,10):
do_step_3()
#Phase 2
if True:
do_step_1('low')
do_something_else()
А затем при необходимости измените True на False.
Теперь, это довольно громоздко. Иногда фазы зависят друг от друга (поэтому, когда я запускаю 3, мне также нужно запустить 1), они являются вложенными и т. Д.
То, что я хочу сделать, - это каким-то образом передать аргумент в мой сценарий, который будет запускать одну или несколько «фаз», и мне нужен какой-то способ, чтобы «пометить» определенные функции, блоки кода или области как часть этой «фазы». Определенный фрагмент кода может быть частью нескольких фаз, так что, когда есть фрагменты B и C, которые зависят от фрагмента A, я мог бы пометить A как часть 'phase1' и 'phase2', а затем, когда я запускаю phase1, он будет запускать чанк A и чанк B, а для фазы 2, чанк A и чанк C. Надеюсь, это все еще имеет смысл.
Так что я подумал, что декораторы были бы идеальными для этого, чтобы я мог (концептуально) сделать что-то вроде
@partOfAPhase("phase1", "phase2")
def f1():
pass
и затем каким-то образом я передаю список «фаз» для запуска моей программе (либо из командной строки, либо путем установки ее в качестве переменной конфигурации где-нибудь), и когда моя программа запускается, она выполняет только те функции, которые были оформлены как часть одного из этапов, указанных для запуска.
Итак, , мне нужен общий декоратор, который можно применять к функциям или функциям-членам, которые принимают любое количество аргументов, и мне нужно иметь возможность передавать список тегов. 'самому декоратору. Затем внутри декоратора мне нужно проверить (когда вызывается исходная функция или член), существуют ли теги этого декоратора в глобальном (может быть, статическом классе?) Списке тегов для запуска.
Я посмотрел на https://gist.github.com/Zearin/2f40b7b9cfc51132851a, и, кажется, в самом конце, чтобы сделать более или менее то, что я хочу, все же я не могу полностью разобрать все части вместе, чтобы сделать то, что я хочу. Точнее говоря, я не совсем понимаю генератор с двумя вложенными декораторами и то, понадобятся ли мне две функции или только одна для его реализации, а также как я получу доступ к аргументу, который передается декоратору (то есть к этапам запуска ).