在python中导入files.py的问题

时间:2018-12-16 09:38:57

标签: python python-import

我认为这是一个非常基本的问题,但是我什么也找不到。抱歉,如果这恰好是重复项。

我有一个定义了一些功能的文件,我们称这个文件class Tree: def __init__(self, children=None, label=None, value=None): self.children = children if children is not None else [] ...

在此文件中,我依赖一个函数,我们可以将其称为main_functions.py。例如,在文件foo()中,我们可以像这样:

main_functions.py

def bar(): return foo() 在另一个文件foo()

中定义
secondary_functions.py

现在,在我的def foo(): return 1 脚本中,我想导入一个可以定义main的文件,然后执行以下操作:

foo()

如果这样做,from secondary_functions import * # Here I define foo() from main_functions import * bar() 中的函数将无法找到main_functions中存在的定义,并且我会收到类似以下错误:

  

NameError:未定义名称'foo'

对我来说解决这个问题非常重要。

我的目标是能够拥有名为secondary_functions的{​​{1}},secondary_functions1.py等其他文件。

而且,要解决该问题,我不想每次都依赖这些定义的文件发生更改,例如每次都插入secondary_functions2.py之类的东西来解决问题。我只想更改主脚本。

3 个答案:

答案 0 :(得分:1)

在import语句之后,变量pippo已成为主程序范围内的全局变量。但是,全局变量不会被导入的模块继承。模块应该能够作为独立单元独立存在,可以通过任何程序导入。想象一下,如果他们开始使用从导入它们的变量开始的变量,那会出什么问题……

因此,唯一的方法就是明确地将值“赋予”模块,例如作为附加函数参数。您可以将main_functions.py中的所有内容放在一个类中,然后让主脚本为其提供所需的全局变量作为其init构造函数的参数,以便它可以存储它们供{{1 }}和其他方法。

答案 1 :(得分:1)

foo名称导入到main.py中。 foo在main_functions.py模块中不可用,因为您尚未将其导入到该模块中。请参阅Namespaces with Module Imports,详细了解其为何如此工作。

一种执行所需操作的方法是提供foo作为bar()的参数。示例:

main.py:

from secondary_functions import foo
from main_functions import bar 

bar(foo)

main_functions.py:

def bar(foo):
    return foo()

secondary_functions.py:

def foo():
    return 1

答案 2 :(得分:0)

似乎问题出在没有正确地调用文件,这是因为您没有正确地调用pippo,如果pippo是全局变量,那么我不明白为什么它不起作用。我想解决这个问题的唯一方法是说file.pippo

如果您要使用名为pippo的变量创建多个文件,那么最好不要将它们设置为全局文件,然后像我刚刚向您展示的那样单独进行调用。

另一个可能是问题的原因是,如果您在函数内部定义pippo,那么它将pippo设为该函数的局部变量。

我能想到的最后一个问题是,如果您在main_functions中使用它们,并且它们尚未在main_functions中定义,并且您没有将文件导入到main_functions中,即 # in main_functions.py
import secondary_functions

那么,我认为main_functions不能在不为要使用它们的函数添加参数的情况下找到该函数和变量。或者再次可以执行类似file.pippo

的操作