使用函数作为输入

时间:2015-01-25 03:36:44

标签: python python-2.7

我编写了一个程序(A),它将我在单独程序(B)中编写的函数的名称作为输入。我想在程序(A)中使用这些函数,所以我试图通过这样做来运行(A):A(f1,f2,f3,f4)

在(A)的顶部,我使用导入B导入程序(B)。在(A)中只有一个函数(不包括main)接受四个输入(f1,f2,f3,f4),然后使用它们,像这样:

    for i in range(x, y):
       z = B.f1(i)
       u = B.f2(i)
       ...
    ...

问题是,当我尝试运行A(f1,f2,f3,f4)时,我收到错误

Traceback (most recent call last):
   File "<pyshell#0>", line 1, in <module>
      A(f1, f2, f3, f4)
NameError: name 'f1' is not defined

我看到python没有将(B)中的函数识别为(A)中的输入,但我不知道为什么或如何连接这两个程序。

更新:计划A

def A(f1, f2, f3, f4) :

   x = 0
   y = 10

   for i in range(x, y):
       x = B.f1(i) //returns float
       plt.plot(i, x)
   ... 

3 个答案:

答案 0 :(得分:2)

根据您的问题的字面读数,如果您通过

导入B.
import B

然后对B中定义的函数,变量,类等的每个引用都必须以B.func1等形式完成。

您的错误消息清楚地表明您正在尝试A(f1, f2, f3, f4)。这应该是A(B.f1, B.f2, B.f3, B.f4)

编辑从您更新的问题判断,我猜你想要的是:

import B

def A(input_function1, input_function2, input_function3, input_function4) :
    x = 0
    y = 10

    for i in range(x, y): #btw, you don't need the x value here if it's 0
        x = input_function1(i) //returns float #I removed the 'B.'
        plt.plot(i, x)
    # Other stuff here

if __name__=='__main__':
    A(B.f1, B.f2, B.f3, B.f4)
    # or alternatively A(B.f78, B.f21, B.f1, B.f90) or whatever

或者:

from B import f1, f2, f3, f4

def A(f1, f2, f3, f4) :
    # Stuff here

if __name__=='__main__':
    A(f1, f2, f3, f4) # Explicit imports mean that the 'B.' prefix is unnecessary

答案 1 :(得分:0)

要扩展@zehnpaard已经建议的内容,如果你想使用 f1 ... f4 A()中调用 B 功能>作为参数,您也可以使用getattr(),如下所示:

...
def A(f1, f2, f3, f4) :

   x = 0
   y = 10

   for i in range(x, y):
       x = getattr(B, f1)(i)
       plt.plot(i, x)
   ... 

getattr(B, f1)将返回B.f1中的函数,然后调用函数并将参数i(i)一起传递,就像:getattr(module, function)(*args)一样。

例如:getattr(plt, 'plot')(i, x) = plt.plot(i, x)

请注意您将plot作为字符串'plot'传递,因此当您尝试调用函数 A()时,您将执行以下操作:

if __name__=='__main__':
    A('f62', 'f22', 'f2323', 'f100')

作为附注:如果您传递的功能不在 B 中,则会引发AttributeError

希望这有帮助。

答案 2 :(得分:0)

听起来您在交互式会话中定义了以下内容

import B

def A(f1, f2, f3, f4):

    for i in range(10):
        plt.plot(i, f1(i))

用户应该通过执行以下操作来调用它:

>>> A(B.f1, B.f49, B.f100, B.f42)