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()
  • Вопрос задан
  • 286 просмотров
Решения вопроса 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
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы