Как не вызывать словарь при проверке
Это макет ситуации в которую, я попал. Независимо от ситуации, при упаминания словаря с функциями, он свершает все записанные в него функции. Ккак не выводить весь словарь и вызывать его в его ветке?
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']()
Результат будет тот же самый. Просто вы фактически оставите в словаре ссылку на функцию, которая при вызове, вызовет вашу функцию с передачей ей указанных параметров
