如何从列表中随机调用任何方法

时间:2014-07-10 16:21:29

标签: python web2py-modules

我仍然是web2py和python的新手,在我的web2py应用程序中,我创建了这个在python shell中运行良好的代码。

python模块: 这些方法的工作方式是用户输入方程式查询以获得答案。如果它是一个加法,则method1可以解决这个问题,与调用其他方法执行不同的代码相同,例如。

def method1():# to do additions
    name = input('Please Enter equation here: ').lower()
    if '1 + 1':
        answer = code
        return answer

def method2():# to do subtractions
    name = input('Please Enter equation here: ').lower()
    if '1 - 1':
        answer = code
        return answer

在控制器中,我按如下方式导入了方法,尽管有比这些方法更多的方法

from applications ...... import method1
from applications ...... import method2
from applications ...... import method3
from applications ...... import method4

method1 = method1
method1 = method2
method1 = method3
method1 = method4

G0 = [method1, method2, method3, method4]

def Foo():
    code..
    for (func) in G0:
        return func()

问题是只调用列表中位置[0]的method1而不调用其他方法。我想在用户输入任何查询时随机调用任何方法。

4 个答案:

答案 0 :(得分:2)

您正在寻找yield

G0 = [method1, ..., method4]

def foo():
    for method in G0:
        yield method()

method_results = foo()
type(method_results) # <class 'generator'>
for result in method_results:
    print(result)
## OUTPUT will be each result, one per line

虽然我认为更深层次的问题是:

method1 = method1
method1 = method2 # method1 = ... huh?
method1 = method3 # help I'm trapped in an
method1 = method4 # overwrite factory....

答案 1 :(得分:1)

只调用method1,因为你从循环内部返回,所以循环也退出。你想要什么回报?可能包含所有返回值的列表?

def Foo():
    ret_list = []
    for (func) in G0:
        ret_list.append(func())
    return ret_list

答案 2 :(得分:1)

如果您想随机调用方法,请使用random.choice

def foo1():
    print "hello"

def foo2():
     print "world"

def foo3():
     print "goodbye"

def foo4():
     print "world"
GO = [foo1, foo2, foo3, foo4]

import random

def Foo():
    func = random.choice(GO)
    return func()
In [30]: Foo()
world

In [31]: Foo()
goodbye

In [32]: Foo()
hello

In [33]: Foo()
goodbye

答案 3 :(得分:0)

您是否尝试在G0中运行所有这些方法?如果是这样,问题是您正在使用return func()return关键字一旦被调用就会退出Foo(),这就是为什么只调用一个函数的原因。如果要存储值,则应使用func()result = func()

如果您只想运行其中一种方法,则需要抛弃for循环并使用return G0[x](),其中x是您想要的函数的列表索引调用