2014-11-17 5 views
3

사실 파이썬 경우 : 저는 현재 문 경우 중첩,하지만하고는 N 변수 중 하나 이상이 하나 이상의이, B, C 및 D가 정의되고 있는지 제가 확인해야

def myfunction(input, a=False, b=False, c=False, d=False): 
    if <more than one True> in a, b, c, d: 
    print("Please specify only one of 'a', 'b', 'c', 'd'.) 

무시 무시 해 보인다. 더 나은 것을 제안 해 주시겠습니까? 값을 추가

+2

아마도 다른 함수 서명이 순서에 있습니다. 사용자가 정확히 하나의 선택을 할 수 있다면,'def myfunction (input, choice)'에 대해'choice'가 "a", "b", "c", "d"중 어느 하나일까요? – Kevin

+0

'multiple_true (a, b, c, d) : ... '의 경우 사용법 :'을 반환합니다. –

+0

@Martijn Pieters - 복제본은 어디에 있습니까? – TheChymera

답변

7

시도 :

if sum([a,b,c,d]) > 1: 
    print("Please specify at most one of 'a', 'b', 'c', 'd'.") 

부울 값이 int에서 상속 때문 작동하지만, 누군가가 정수를 전달하는 경우가 남용 될 수 있습니다.

if sum(map(bool, [a,b,c,d])) > 1: 
    print("Please specify at most one of 'a', 'b', 'c', 'd'.") 

을 또는 당신이 원하는 경우 정확히 하나 개의 플래그는 True로 : 그 경우 위험이 논리 값에 모든 캐스팅 마음에 오는

if sum(map(bool, [a,b,c,d])) != 1: 
    print("Please specify exactly one of 'a', 'b', 'c', 'd'.") 
+0

'int (True)'는 항상 1이므로, 이것이 작동합니다, 왜 downvote입니까? +1. – Maroun

+1

괄호를 확인하십시오. –

+1

나는 downvote하지 않았지만, 모든 값이 false이면'sum ([a, b, c, d])! = 1'도 참입니다. 이는 OP의 "하나 이상의 체크"동작과 약간 다른 로직입니다. – Kevin

9

우선 :

if [a, b, c, d].count(True) > 1: 
2

정확히 1을 원하면 True 값 :

def myfunction(input, a=False, b=False, c=False, d=False): 
    if filter(None,[a, b, c, d]) != [True]: 
     print("Please specify only one of 'a', 'b', 'c', 'd'.)")