Задать вопрос
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()
  • Вопрос задан
  • 288 просмотров
Подписаться 1 Простой 9 комментариев
Решения вопроса 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
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы
SpectrumData Екатеринбург
от 200 000 до 300 000 ₽
Greenway Global Новосибирск
от 150 000 ₽
Akronix Санкт-Петербург
от 150 000 до 200 000 ₽
22 янв. 2025, в 04:08
6000 руб./за проект
21 янв. 2025, в 23:55
20000 руб./за проект
21 янв. 2025, в 23:35
80000 руб./за проект