2017-01-19 6 views
2

Вот мой код:Вызов функции с параметрами, с использованием словаря

def funcWithParam(param): 
    print "Your parameter is: " + param 


def justFunction(): 
    print "No parameters" 


def wrong(): 
    print "wrong choice" 


userInput = raw_input("type 'params' for parameters. type 'no' for no parameters: ") 


if userInput == "params": 
    myparam = "type your parameter: " 

else: 
    myparam = "" 


dic = { 
    "params": (funcWithParam(myparam)), 
    "no": justFunction, 
} 

dic.get(userInput,wrong)() 

Я знаю, что код не так, и каждый раз, когда я запускаю его, «Титулы» ключ выполняется со строкой «UserInput» , Если в параметре проверка равна True, и я добавлю второй аргумент, то программа не сработает:

Объект NoneType не может быть вызван.

Интересно, какой правильный синтаксис/способ вызова функции с параметрами с помощью словаря.

ответ

2

Это потому, что вы строите словарь, как:

dic = { 
    "params": (funcWithParam(myparam)), #here you already call the function 
    "no": justFunction, #this is a real function 
} 

Это, таким образом, означает, что словарь делает не содержит функцию для "params", но результат этой функции. Если вы позже выберете "params" из словаря, он вернет None (потому что funcWithParam вернулся None), а затем вы пытаетесь позвонить None (например, None()), который не поддерживается.

Вы можете просто преобразовать словарь в ленивый:

dic = { 
    "params": (lambda : funcWithParam(myparam)), 
    "no": justFunction, 
} 

Или еще более элегантно:

dic = { 
    "params": (lambda x=myparam : funcWithParam(x)), 
    "no": justFunction, 
} 

lambda : funcWithParam(myparam) создает анонимную функцию без параметров, которые будут называть funcWithParam с myparam.

+0

Спасибо! Я не знал об этом «лямбда», и это именно то, что мне нужно. –

1

Когда вы создаете словарь, поскольку вы помещаете "params": (funcWithParam(myparam), он вызывается, и поэтому то, что вы помещаете в словаре, является возвращаемым значением функции.

Для того, чтобы поместить его в словаре, и называем его ключом, вам нужно сделать, это:

dic = { 
    "params": funcWithParam, 
    "no": justFunction, 
} 

dic.get(userInput,wrong)(myparam) 

Попробуйте запустить это и посмотреть, что вы получите:

def funcWithParam(param, *args): 
    print "Your parameter is: " + param 

def justFunction(*args): 
    print "No parameters" 

def wrong(*args): 
    print "wrong choice" 


userInput = raw_input("type 'params' for parameters. type 'no' for no parameters: ") 
if userInput == "params": 
    myparam = raw_input("type your parameter: ") 
else: 
    myparam = "" 


dic = { 
    "params": funcWithParam, 
    "no": justFunction, 
} 

dic.get(userInput, wrong)(myparam) 
Смежные вопросы