Python模块:相互调用的函数

Python模块:相互调用的函数,python,python-import,execfile,Python,Python Import,Execfile,我把自己弄糊涂了。我有一组python函数,所有这些函数都拼凑在一个名为(比方说)use.py的文件中。然后,我可以将模块读入我的ipython import useful as uf 然后我可以使用 uf.meaning_of_life() 等等。标准的东西 但是-此文件中的某些函数调用其他函数。我可以随时使用uf.调用单个函数,但是相互调用的函数呢?如果一个名为eat的函数引用了另一个名为chew的函数,那么eat如何知道在哪里可以找到chew?我可以同时调用uf.eat和uf.ch

我把自己弄糊涂了。我有一组python函数,所有这些函数都拼凑在一个名为(比方说)
use.py的文件中。然后,我可以将模块读入我的ipython

 import useful as uf
然后我可以使用

 uf.meaning_of_life()
等等。标准的东西

但是-此文件中的某些函数调用其他函数。我可以随时使用
uf.
调用单个函数,但是相互调用的函数呢?如果一个名为
eat
的函数引用了另一个名为
chew
的函数,那么
eat
如何知道在哪里可以找到
chew
?我可以同时调用
uf.eat
uf.chew

我可以通过简单地执行
execfile('usiver.py')
来忽略所有这一切,这非常有效,但我希望在模块系统上获得更多的句柄

当前,当我使用
import
时,尝试使用我的函数会产生错误;当我使用
execfile
时,一切正常


我理解这可能被理解为一个非常初级的问题,但我是从Matlab背景开始学习Python的,我的自然倾向是使用
execfile
。非常欢迎指向信息的指针。

首先,建议使用“从某个文件导入定义”作为某种东西,让我使用您的函数定义为您提供一个清晰的图像。我将编写简单的函数来吃和嚼。嚼东西吃的地方

有用的.py

def eat():
    print 'Eaten'

def chew():
    eat()
main File.py代码

from useful import chew as uf

uf()

通过调用引用eat函数的chew函数的uf别名。欢迎使用python。

为了了解正在发生的事情,您首先需要了解的是,每个模块都有自己的本地名称空间

如果您有这样一个模块:

def chew():
    print('chewing')

def eat():
    print('eating')
    chew()
显然,
eat
可以毫无问题地调用
chew
,这不是很明显吗?它们被定义在同一级别,在全局(模块)范围内,因此它们可以清楚地看到彼此

现在,我们在另一个模块中执行以下操作:

为了访问
chew
,我们需要编写
uf.chew
,就像我们键入
uf.eat
一样。 我们需要这样做,因为我们在另一个模块中。为了做到这一点,我们必须
导入有用的
,以便我们的模块知道它。我们对
有用的
模块的了解是,它的内容被添加到
uf
名称中

这是我们的观点。但是
有用的
模块知道自己的一切。那里什么都没有改变,它不需要导入自己来访问它的内容,它也不知道它自己没有导入的其他模块的任何信息


所以要回答,
eat
知道如何找到
chew
,因为它们在同一模块中,因此,在相同的范围内。

eat
chew
作为同一模块中的函数,可以通过它们的非限定名称
eat
chew
相互引用。如果您确实必须将'usable.py'中的所有内容导入当前python模块的命名空间中,
从有用的导入*
将导入除前缀为“\u1”的名称之外的所有内容。然后可以从当前模块以
chew
而不是
uf.chew
的形式访问它们。这种做法通常是不受欢迎的,因为你突然不知道已经定义了哪些名称。顺便问一下,会出现什么错误?使用
uf.chew
有什么问题吗?我会看看是否能更清楚地解释我的问题,但现在是凌晨1:30,我想我可能会先睡一会儿!感谢您到目前为止提供的所有帮助和建议。除非您仅使用具有非常明显名称的单个(或少数)函数,或者使用与模块同名的类,否则执行
导入有用的
是可以的,因为它会导入每个函数都存在的单个名称,而不会污染当前命名空间。这个答案也不是对原来问题的回答(除非我弄错了)。非常感谢你的明确解释。所以让我弄清楚:eat()可以愉快地访问chew(),因为它们在同一个模块中,但从我的角度来看,我只能以uf.eat()和uf.chew()的形式访问它们。这是有道理的。然而,事实仍然是,如果我使用import,那么一些函数根本不起作用,但是如果我使用execfile读取文件,它们都可以完美地工作。我不确定我做错了什么…很可能你在你的模块中做了一些不恰当的事情。如果你在你的问题中贴一个帖子,我也许能帮你。我已经在上面放了一个文件,里面有一个简短的解释,还有令人不快的代码。非常感谢@阿拉斯代尔,这不是一个好消息。我试过几次运行它,但我无法重现您的问题。您当前的问题显然是(XY问题)[而真正的问题可能更适合(代码审查)[啊,好吧-这超出了我有限的知识范围。但感谢您的时间和建议!我会继续努力,最坏的情况下,我总是会求助于“execfile”。
import useful as uf

uf.eat()