2016-09-26 4 views
1

아마도 간단한 문제에 봉착했습니다. 함수를 사용하여 선택하면 모든 것이 실행되는 것처럼 보입니다. 예 :이 스크립트를 실행하는 경우나열된 모든 함수 호출을 실행하는 임의 선택 Python

from ordereddict import OrderedDict 
from random import choice 

def PrintStrings(): 
    Text = choice(["Gutentag!", "Ni hao!", "Hola!"]) 
    print "Chosen Text is:", Text 
    return Text 

class Greeting(): 
    fields = OrderedDict([ 
     ("Morning",  "Hi"), 
     ("Afternoon", "Good Afternoon!"), 
     ("Evening",  "Good Evening!"), 
    ]) 

    def change(self): 
     self.fields["Morning"] = "Good morning!" 

    def changerandom(self, n = 1): 
     function=[ 
        {self.fields["Morning"]: PrintStrings()}, 
        {self.fields["Afternoon"]: PrintStrings()}, 
        {self.fields["Evening"]: PrintStrings()}, 
       ] 
     result = {} 
     for i in range(n): 
      result.update(choice(function)) 
      print "Updated string:",result 
      return result 

text = Greeting() 
text.change() 
text.changerandom() 

, 내가있는 동안은 안 실행 3

    {self.fields["Morning"]: PrintStrings()}, 
        {self.fields["Afternoon"]: PrintStrings()}, 
        {self.fields["Evening"]: PrintStrings()}, 

얻을. 이 스크립트는 반환

Chosen Text is: Ni hao! 
Chosen Text is: Gutentag! 
Chosen Text is: Hola! 
Updated string: {'Good morning!': 'Hola!'} 

예상 결과는 다음과 같습니다

Chosen Text is: Hola! 
Updated string: {'Good morning!': 'Hola!'} 
+0

'{self.fields [ "Morning": PrintStrings()}'를 쓸 때'PrintStrings()'를 호출합니다. 'function'리스트 생성의 전체가 수행됩니다. – njzk2

+0

BTW - 현재'Text'라고 불리는 변수는 대신'text'라고 명명되어야합니다; [PEP-8, Python 스타일 가이드] (https://www.python.org/dev/peps/pep-0008/)를 참조하십시오. –

답변

0

이상한 데이터 구조 선택을 제쳐 퍼팅, 당신은 function에서 함수를 호출한다. 괄호를 제거하여 함수를 객체으로 전달하십시오. 이 방법으로, 우리는 우리의 임의의 키를 잡아를

def changerandom(self, n = 1): 
    result = {} 
    for i in range(n): 
     key_choice = Greeting.fields[choice(Greeting.fields.keys())] 
     result[key_choice] = PrintStrings() 
     print "Updated string:", result 
     return result 

, 모두 동일한 반복에서 PrintStrings() 전화 : -

PrintStrings()>PrintStrings

여기에 필요한 출력을 얻기 위해 가능한 솔루션입니다.

class PrintStrings(object): 
    def __init__(self): 
     self.text = None 
    def __str__(self): 
     if self.text is None: 
      text = choice(["Gutentag!", "Ni hao!", "Hola!"]) 
      print "Chosen Text is:", text 
     return text 
    def __repr__(self): 
     return str(self) 

코드의 나머지 부분이 클래스가 PrintStrings 기능을 대체하여, 그대로 사용할 수 있습니다

+0

그래, 그 전에 시도했지만 개체가 아닌 문자열을 인쇄합니다. 난 str(), 행운을 시도했다. 업데이트 된 문자열 : { '좋은 아침!': } – user1473508

+0

@ user1473508, 당신이해야 할 일은 ** 선택한 ** 기능을 ** 선택한 후 ** 호출하는 것입니다. 원래 문제는 호출하기 전에 * 호출 *을 선택하여 (호출하도록 선택하지 않은 함수조차도 발생 시킴) 위의 설명에서 설명한 문제는 전혀 호출하지 않아서 발생합니다. –

+0

@Charles 잘 모르겠습니다. – user1473508

0

객체는 당신에게하지 인스턴스화에 만 직렬화에서 코드를 실행할 수있는 방법을 제공 할 것입니다.