2014-02-24 3 views
0

전역 변수 1,2,3 ...을 가지고 있고 "하나"또는 "두"가 될 수있는 변수 "num"(문자열)이 있습니다. "세"... 나는 다음 일을 할 : 펄파이썬에서 else를 사용하는 대신에 eval을 사용하는 방법

if num == "one": 
    one = True 
elif num=="two": 
    two = True 
elif num=="three": 
    three = True 
... 

내가 한 라인으로 작업을 수행 할 수 있습니다 "진정한 $ 인분 ="평가 같은 것을 대신 긴의 다른 위의 경우. 파이썬으로 어떻게 할 수 있습니까?

globals()[num] = True 

을하지만 당신은 일반적으로 당신의 변수 이름에서 데이터를 보존하려면 :

+4

[평가를 사용하는 것은 좋지 않습니다.] (http://stackoverflow.com/a/1832957/1211429). –

+0

실제로 여기서 무엇을하려고합니까? 나는이 전체적으로 진실한/틀린 것을 피하는 더 간단한 해결책이있는 경우에 놀래 지 않을 것입니다. –

+0

당신은 거의 틀린 길을 거의 확실하게하고 있습니다. 무엇을 성취하려고합니까? –

답변

0

print switch_dict[num] 

또는 제어 흐름을 위해 다시 의미있는 데이터를 얻기 위해,이 하려고 생각하고있는 것이 무엇이든간에 달성하려면 better ways입니다. 다음과 같이하십시오.

one, two, three = False, False, False 
print "before:", one, two, three # before: False False False 
num = "two" 
eval("globals().update({%r: True})" % num) 
print " after:", one, two, three # after: False True False 
+0

더 나은 솔루션이 있다는 것을 알고 있지만 다른 사람들이 코드를 변경하지 않아도되는 솔루션을 찾고 있습니다. 이것은 내가 찾고 있었던 바로 그 것이다! 고마워. – yehudahs

8

당신은 사전으로 글로벌 이름을 액세스 할 수 globals()를 사용할 수 있습니다. 대신 여기 전역 대신 사전을 사용 아마도 객체

numbers = {'one': False, 'two': False, 'three': False} 

numbers[num] = True 

또는 :

class Numbers: 
    one = two = three = False 

numbers = Numbers() 

setattr(numbers, num, True) 
0

평가가 그래서 그냥 전역처럼, 오히려 위험하다() 나는 약간 더 eligant 솔루션을 제공하고있다.

"1", "2"등의 키를 사용하여 사전을 만들고 싶다면 False 값을 입력하십시오. 그럼 당신이 할 필요가있다 :

if num in switch_dict: 
    switch_dict[num] = True 

그런 다음 당신이 할 필요가 대부분이지만

if switch_dict[num]: 
    <do stuff> 
관련 문제