我的main.py包含:
import functions
a=2
b=3
print(functions.function1(2))
我的functions.py包含:
import main
def function1(x):
return x+main.a+main.b
def function2(x):
return x-main.a-main.b
def function3(x):
return x*main.a*main.b
当我运行主程序(与functions.py位于同一文件夹中)时,它返回一个错误:
File "C:\...\main.py", line 6, in <module>
print(functions.function1(2))
AttributeError: module 'functions' has no attribute 'function1'
我在这里做错了什么?我以为这是进口东西的方式?我想修复它,但也要确切地理解问题。
注意:由于这个原因,我不想将a和b用作其他函数的参数,请参阅我的相关问题Python function in separate file: they all require the same parameters. How to make global variable in multiple file?
答案 0 :(得分:1)
您不能在文件之间相互导入数据。 尝试更改 functions.py 中的函数以接受 a 和 b 作为参数,如下所示:
def function1(x, a, b):
return x+a+b
def function2(x, a, b):
return x-a-b
def function3(x, a, b):
return x*a*b
然后将它们传递到 main.py 中的函数调用中,如下所示:
import functions
a=2
b=3
print(functions.function1(2, a, b))
答案 1 :(得分:1)
如果您不想将变量a
和b
用作参数,则可以创建文件my_vars.py
并在其中放置变量:
a = 2
b = 3
然后在您的functions.py中,您可以通过导入my_vars.py使用这些变量:
import my_vars
def function1(x):
return x + my_vars.a + my_vars.b
def function2(x):
return x - my_vars.a - my_vars.b
def function3(x):
return x * my_vars.a * my_vars.b
然后您的main.py将如下所示:
import functions
print(functions.function1(2))
仅使用带有常量的文件通常是一个好方法
要了解为什么您的方法不起作用,可以阅读有关circular imports
的信息。答案 2 :(得分:1)
如果您确实希望不将参数作为参数传递,则可以改用一个类:
#main.py
import functions
f = functions.f()
f.a=2
f.b=3
print(f.function1(2))
# functions.py
class f:
def __init__(self):
# default values for a and b
self.a = 2
self.b = 3
def function1(self, x):
return x + self.a + self.b
使用类还有一个副作用,即您可以同时拥有两个实例,每个实例都有自己的a
和b
:
f1 = functions.f()
f1.a = 2
f1.b = 3
f2 = functions.f()
f2.a = 12
f2.b = 13
print(f1.function1(2))
print(f2.function1(2))
答案 3 :(得分:1)
目前尚不清楚原因,但如果您将变量放在自己的模块中,则可能会有所帮助
像这样:
# main.py
import functions
import variables
# you able to use it here
# print(variables.a)
print(functions.function1(2))
# functions.py
import variables
def function1(x):
return x+variables.a+variables.b
def function2(x):
return x-variables.a-variables.b
def function3(x):
return x*variables.a*variables.b
# variables.py
a=2
b=3
答案 4 :(得分:0)
在functions.py中,您可以import main
在函数的主体中,从而避免了循环导入。
def function1(x):
import main
return x+main.a+main.b
def function2(x):
import main
return x-main.a-main.b
def function3(x):
import main
return x*main.a*main.b