Amunrah
@Amunrah
Сказочный персонаж ))

Как заставить дефолтные значения аргументов функции вычислятся каждый раз?

Как сделать, чтобы дефолтные значения аргументов вычислялись при каждом вызове функции?
from random import randint, uniform

def my_func(  arg_1 = uniform( 0.8, 2.2 ), 
              arg_2 = randint( -3, 3 ),
              arg_3 = randint( -3, 3 ) ):
    print( arg_1 )    
    print( arg_2 )
    print( arg_3 )

my_func()
my_func()
my_func()
  • Вопрос задан
  • 167 просмотров
Решения вопроса 1
  • Amunrah
    @Amunrah
    Сказочный персонаж ))
    Спасибо всем за подсказки. Получилось вот такое решение:

    Ввод:
    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


    Декоратор удобен тем, что его можно спрятать в другой модуль.
    Ответ написан
Пригласить эксперта
Ответы на вопрос 2
  • @lega
    Никак, значения создаются в момент компиляции функции (хотя можете каджый раз компиллировать динамический).
    Но обычно делают так:
    def foo(value=None):
      value = value or []
    Ответ написан
  • @Stqs
    senior software developer
    как-то так
    from random import randint, uniform
    
    def argrandomizer(func):
        def wrapper():
            arg_1 = uniform(0.8, 2.2)
            arg_2 = randint(-3, 3)
            arg_3 = randint(-3, 3)
            return func(arg_1, arg_2, arg_3)
        return wrapper
    
    @argrandomizer
    def my_func(arg_1, arg_2, arg_3):
        print( arg_1 )    
        print( arg_2 )
        print( arg_3 )
    
    my_func()
    my_func()
    my_func()

    вывод
    1.48763356514
    -3
    -3
    2.07023550873
    -2
    3
    1.48356419425
    -2
    -1
    Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы