Спасибо всем за подсказки. Получилось вот такое решение:
Ввод:
from random import uniform, randint
def reload_defaults( func ):
def reloader( *args, **kwargs ):
defaults = [ ('arg_1', uniform( 0.8, 2.2 ) ), ('arg_2', randint( -3, 3 )), ('arg_3', randint( -3, 3 )) ]
args = { val[0]:args[i] if len(args) > i else val[1] for i,val in enumerate(defaults) }
args.update( kwargs )
return func( **args )
return reloader
@reload_defaults
def my_func( arg_1, arg_2, arg_3 ):
print( arg_1 )
print( arg_2 )
print( arg_3, '\n' )
my_func()
my_func( 1, arg_3 = 45 )
my_func( arg_2 = 145 )
my_func( uniform(10.5, 20.5) )
my_func( 33, 10 )
my_func( 5, 7, randint(-10, 10 ) )
Вывод:
1.9722310572222892
0
3
1
-1
45
0.890632243066556
145
3
12.374446906130364
1
-3
33
10
-3
5
7
-7
Декоратор удобен тем, что его можно спрятать в другой модуль.