Python模块:相互调用的函数
我把自己弄糊涂了。我有一组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
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()