从其他文件导入功能不起作用



My main.py包含:

import functions
a=2
b=3
print(functions.function1(2))

我的函数.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

当我运行main(它和functions.py在同一个文件夹中(时,它会返回一个错误:

File "C:...main.py", line 6, in <module>
print(functions.function1(2))
AttributeError: module 'functions' has no attribute 'function1'

我在这里做错了什么?我以为这是进口东西的方式?我想解决这个问题,但也要准确地理解这个问题。

注意:我不想把a和b作为其他函数的参数传递,原因是,请在单独的文件中查看我的相关问题Python函数:它们都需要相同的参数。如何在多个文件中生成全局变量?

如果您不想将变量ab作为参数,您可以创建一个文件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))

只使用带有常量的文件通常是一种很好的方法

要了解为什么你的方法不起作用,你可以阅读关于循环进口

不能在文件之间相互导入数据。尝试更改函数.py中的函数以接受ab作为参数,如:

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))

原因尚不清楚,但如果您将变量放置在自己的模块中,可能会有所帮助

像这样:

main.py

# main.py
import functions
import variables
# you able to use it here
# print(variables.a)
print(functions.function1(2))

函数.py

# 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

变量.py

# variables.py
a=2
b=3

如果你真的想要不作为参数传递的参数,你可以创建一个类:

#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

使用类还有一个副作用,即可以同时拥有两个实例,每个实例都有自己的ab:

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))

在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

最新更新