我编写了一个程序(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)
...
答案 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)