我认为这是一个非常基本的问题,但是我什么也找不到。抱歉,如果这恰好是重复项。
我有一个定义了一些功能的文件,我们称这个文件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
之类的东西来解决问题。我只想更改主脚本。
答案 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