I have several little functions f1
, f2
, f3
and a function f
.
I want f
to be a "container" to f1
, f2
, f3
: to do the some of operations f1
, f2
, f3
, depending on the program configuration (for example f1
and f2
or f1
and f3
or all the three) and nothing more.
I see two simple solutions: first to add some if
's in the function f
:
if configuration_f1_f2:
f1()
f2()
second, I can add a list of operations in f
:
for op in operations:
op()
and add f1
, f2
, f3
in operations
or remove them, depending on configuration.
But can I somehow construct dynamically code of 'f' adding to it calls of f1
, f2
and f3
exact what I need without any if
's or list
's or for
's? I mean something like on the fly code manipulation. So if my configuration is "f1
and f3
", I set code of f
so that it is
f1()
f3()
and when my configuration changes to "f2
and f3
" I modify code of f
to
f2()
f3()
Can I manipulate the code of the function that way?
If you're brave, you can construct a function definition as a string and pass it to the exec
statement. For example:
func = "def f():\n"
if config_f1:
func += " f1()\n"
if config_f2:
func += " f2()\n"
exec func in globals()
At this point, you should have a new global f()
that executes the appropriate bits of code.
If f1
, f2
etc. are functions with side effects, than you should use an explicit for
loop (no fancy map
solution). Perhaps you want something like this?
configurations = {
'config_1': (f1, f2, f3),
'config_2': (f1, f2),
}
def f(config='config_1'):
for op in configurations[config]:
op()
If f1
, f2
etc. receive arguments, then perhaps this is a more suitable definition of f
:
def f(config, *args, **kwargs):
for op in configurations[config]:
op(*args, **kwargs)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With