【问题标题】:How to pass the results of a function from one file to another file如何将函数的结果从一个文件传递到另一个文件
【发布时间】:2020-12-12 23:56:51
【问题描述】:

当我在主文件(名为 INPUT.py)中打印函数的结果时出现错误。这些函数在另一个文件(名为 ENGINE.py)中创建。错误是:AttributeError:模块'ENGINE'没有属性'cross_section' 我不明白为什么会出现这样的错误。

这里是代码示例:

#-- 主文件:INPUT.py

class Duct:
    def __init__(self, width, height):
        self.width = width 
        self.height = height 
    
Duct_ret = Duct(0.1, 0.1)

Duct_ret.width= 0.4
Duct_ret.height= 0.3

import ENGINE as EN
print(EN.cross_section)

#-- 引擎文件:ENGINE.py

from INPUT import width, height

def cross_section(self,):
    c_s=height*width
    return c_s 

错误:AttributeError:模块“ENGINE”没有属性“cross_section”

【问题讨论】:

  • 这有很多问题。 cross_section 格式错误,因为它有一个虚假的逗号,而且它不在一个类中,所以不应该引用 self。此外,从 INPUT.py 导入宽度和高度是无意义的和循环的。您应该将这些作为参数传递给 cross_section 函数。另外,您没有正确调用横截面,您只是打印函数本身,而不是被调用函数的结果

标签: python function input attributes arguments


【解决方案1】:

发生这种情况是因为您的代码中有循环依赖。

ENGINE.py 中,您导入heightwidth,在INPUT.py 中,您导入ENGINE

您应该将 Duct_ret.heightDuct_ret.width 传递给您的辅助函数,而不是导入它。

所以不要这样:

import ENGINE as EN
print(EN.cross_section)

这样做:

import ENGINE as EN
print(EN.cross_section(Duct_ret.height, Duct_ret.width))

ENGINE.py 中,这样定义函数:

def cross_section(height, width):
    c_s = height * width
    return c_s

注意:您还拥有 self 作为 cross_section 的参数,这是不正确的,因为 cross_section 不是类方法 - 您只需将相关参数传递给函数(您的原始代码没有)。

旁注:您应该将import 移动到INPUT.py 中的文件开头,以便在这种情况下获得更好的样式。

【讨论】:

  • 表示高度未定义
  • 啊,是的,在这种情况下,在INPUT.py 中,您没有heightwidth -- 应该是Duct_ret.heightDuct_ret.width。更新了示例。虽然为了风格,您应该将变量重命名为 duct_ret - 即全部小写而不是以大写字母开头。
  • 我还是有同样的问题:
  • print(EN.cross_section(duct_ret.height,duct_ret.width)) AttributeError: module 'ENGINE' has no attribute 'cross_section'
  • 你为什么在ENGINE.pyimporting duct_ret?它不需要任何imports——如果您按照我上面的解释,我们将传递所有相关参数给cross_section()。您应该从ENGINE.py 中删除imports --- 在ENGINE.py 中拥有imports 是首先导致您的循环依赖的原因,如上所述。
【解决方案2】:

@costaparas 给出了非常详细的答案。

我还使用了给定的代码来寻找解决方案。在试图解决这个问题时,我发现您的代码存在 2 个问题:

  1. 您不应该使用 import 来获取不同文件中的类变量。
  2. 您在两个文件中都使用顶级导入,导致错误的循环依赖。

解决方案:

INPUT1.py

class Duct:
    def __init__(self, width, height):
        self.width = width 
        self.height = height 
    
Duct_ret = Duct(0.1, 0.1)

Duct_ret.width= 0.4
Duct_ret.height= 0.3

from ENGINE import cross_section1 as cs
cs(Duct_ret.width, Duct_ret.height)

引擎.py

def cross_section1(width,height):
    c_s=height*width
    print (c_s)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-10
    • 2019-09-08
    • 2016-03-01
    • 1970-01-01
    • 2015-09-07
    • 1970-01-01
    • 2018-10-01
    • 2021-04-24
    相关资源
    最近更新 更多