Как не вызывать словарь при проверке

Рейтинг: 1Ответов: 1Опубликовано: 15.02.2023

Это макет ситуации в которую, я попал. Независимо от ситуации, при упаминания словаря с функциями, он свершает все записанные в него функции. Ккак не выводить весь словарь и вызывать его в его ветке?

con = True

def p(k , a):
print (k,' ', a)


dic = ({
'jon': p(k ='jo', a = 'non'),
'mon': p(k ='mo', a = 'mon') 
})

if not con:
    print( 'con = False ')
else:
    dic
    print('con = True')

введите сюда описание изображения

Ответы

▲ 1

Очень плохо сформулирован вопрос, но, проблема, судя по всему, в том, что у вас функции вызываются, когда вы пытаетесь указать их в качестве значения словаря.

Допустим, у вас есть функция, которая что-то печатает на экран:

def func():
    print('Hello World!')

В данном случае func — будет ссылкой на функцию, а func() — ее непосредственным вызовом. То есть func вы можете передать как аргумент в другую функцию, чтобы позже вызвать (func()) ее там, например:

def func():
    print('Hello World!')

def print_hello_world(function):
    function()
    
print_hello_world(func)

Выхлоп:

Hello World!

Поэтому важно уметь отличать ссылку на функцию от ее вызова.


Вам, очевидно, в качестве значения словаря нужна именно ссылка на функцию. Но вы вместо этого просто вызываете ее.

По аналогии с предыдущим примером:

my_dict = {'key': func()}

Здесь вы вызываете функцию, она печатает текст, но в качестве значения ключа 'key' вы получите None, то есть {'key': None}, потому что функция func ничего не возвращает.

Если бы она была записана как-то так, то есть, возвращала бы результат:

def func():
    return 'Hello World!'

my_dict = {'key': func()}

То в my_dict записался бы только результат работы функции, то есть {'key': 'Hello World!'}


Поэтому вам нужно указать именно ссылку на функцию:

my_dict = {'key': func}

И тогда вы сможете обращаться к ней по ключу 'key' и вызывать вот так:

my_dict['key']()

Теперь перейдем к вашей функции p:

def p(k , a):
    print (k,' ', a)

Ее запись и вызов с передачей аргументов будет выглядеть так:

my_dict = {'key': p}
my_dict['key'](k ='jo', a = 'non')

Если вам нужно заранее задать аргументы прямо в словаре, то здесь стоит воспользоваться lambda-выражением:

my_dict = {'key': lambda: p(k ='jo', a = 'non')}
my_dict['key']()

Результат будет тот же самый. Просто вы фактически оставите в словаре ссылку на функцию, которая при вызове, вызовет вашу функцию с передачей ей указанных параметров