У меня есть файл спецификации BatchJob (batch.spec), похожий на приведенный ниже:
python = <<EOF
def foo():
return f"foo: I am {self.name}"
def bar():
return f"bar: I am {self.name}"
EOF
<batch>
name p&l_calculator
exec echo %foo()%
</batch>
Я преобразую этот файл в файл Python, используя https://github.com/etingof/apacheconfig
from apacheconfig import *
with make_loader() as loader:
config = loader.load('batch.spec')
# Print content of python dict
for key, value in config.items():
print(key, value)
# output from print statement above
# python
# def foo():
# return f"foo: I am {self.name}"
#
# def bar():
# return f"bar: I am {self.name}"
# batch {'name': 'p&l_calculator', 'exec': 'echo %foo()%'}
Теперь я преобразовываю этот python dict в объект BatchJobSpec, как показано ниже:
class BatchJobSpec:
def __init__(self, pythoncode , batch):
self.pythoncode = pythoncode
self.name = batch.get("name")
self.exec = batch.get("exec")
batchjobspec = BatchJobSpec(config.get("python"), config.get("batch"))
Если я напечатаю поля batchjobspec, то получу что-то вроде ниже
print(batchjobspec.pythoncode)
print(batchjobspec.name)
print(batchjobspec.exec)
# Output from above print statements
# def foo():
# return f"foo: I am {self.name}"
#
# def bar():
# return f"bar: I am {self.name}"
# p&l_calculator
# echo %foo()%
Проблема: Я хочу, чтобы значение "batchjobspec.exec" интерполировалось при попытке получить к нему доступ, т.е. оно не должно быть "echo% foo ()%", а должно быть "echo foo: я p & l_calculator».
т.е. как-то в получателе полей, я хочу проверить, есть ли синтаксис "%%".Если да, и если содержимое внутри "%%" содержит вызываемый объект, то я хочу вызвать этот вызываемый элемент и добавить значение, возвращаемое из вызываемого элемента, к значению соответствующего поля.Полагаю, мне придется сделать эти вызовы доступными и в BatchJobSpec.