Как заставить дефолтные значения аргументов функции вычислятся каждый раз?
Никак, значения создаются в момент компиляции функции (хотя можете каджый раз компиллировать динамический).
Но обычно делают так:def foo(value=None):
  value = value or []
Спасибо всем за подсказки. Получилось вот такое решение:
Ввод: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
Декоратор удобен тем, что его можно спрятать в другой модуль.