从其他文件导入功能不起作用 main.py functions.py variables.py

问题描述

我的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?

解决方法

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

def function1(x,a,b):
    return x+a+b
    
def function2(x,b):
    return x-a-b

def function3(x,b):
    return x*a*b

然后将它们传递到 main.py 中的函数调用中,如下所示:

import functions

a=2
b=3

print(functions.function1(2,b))
,

如果您不想将变量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))

仅使用带有常量的文件通常是一个好方法

要了解为什么您的方法不起作用,可以阅读有关circular imports

的信息。 ,

如果您确实希望不将参数作为参数传递,则可以改用一个类:

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

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

像这样:

main.py

# main.py

import functions
import variables

# you able to use it here
# print(variables.a)

print(functions.function1(2))

functions.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

variables.py

# variables.py
a=2
b=3
,

在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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...