我坚持一个可能很简单的问题: 当使用函数选择时,似乎所有这些都被执行而只有一个应该执行。 例如:
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 :(得分:0)
抛开一些奇怪的数据结构选择,你在function
调用一个函数。删除括号'将该函数作为对象传递。
PrintStrings()
- > PrintStrings
这是获得所需输出的可能解决方案:
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()
。
答案 1 :(得分:0)
对象将为您提供仅在序列化时运行代码的方法,而不是实例化:
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
函数。