2016-09-26 11 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

オブジェクトはあなたではないのインスタンス上で、唯一のシリアル化でコードを実行するための手段を提供します。

関連する問題