Python 模块:函数相互调用

Ala*_*air 6 python python-import execfile

我让自己很困惑。我有一组 python 函数,所有这些函数都放在一个名为 (假设) 的文件中useful.py。然后我可以将模块读入我的 ipython

 import useful as uf
Run Code Online (Sandbox Code Playgroud)

然后我可以访问各个功能

 uf.meaning_of_life()
Run Code Online (Sandbox Code Playgroud)

等等。标准的东西。

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

我可以通过简单地执行execfile('useful.py')非常有效的操作来忽略所有这些,但我想更多地了解模块系统。

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

我很欣赏这可能会被解释为初学者的问题,但我是从 Matlab 背景开始接触 Python 的,我自然倾向于使用execfile. 非常欢迎指向信息的指针。

Dar*_*ogg 6

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

如果您有这样的模块:

def chew():
    print('chewing')

def eat():
    print('eating')
    chew()
Run Code Online (Sandbox Code Playgroud)

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

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

import useful as uf

uf.eat()
Run Code Online (Sandbox Code Playgroud)

为了访问chew,我们需要uf.chew像打字一样写字uf.eat。我们需要这样做,因为我们在另一个模块中。为了让我们做我们必须做的任何事情import useful,以便我们的模块知道它。我们对useful模块的了解是它的内容被添加到uf名称中。

这是我们的观点。但是useful模块知道关于它自己的一切。一切都没有改变,因此,它并不需要进口本身来访问它的内容,它不知道任何有关其他模块,它没有import编本身。

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


Ser*_*ney 0

首先,建议使用 from somefile 导入定义,因为让我使用您的函数定义来给您一个清晰的了解。我会写一些简单的函数来吃和咀嚼。参考文献会在哪里咀嚼。

有用的.py

def eat():
    print 'Eaten'

def chew():
    eat()
Run Code Online (Sandbox Code Playgroud)

主要File.py代码

from useful import chew as uf

uf()
Run Code Online (Sandbox Code Playgroud)

通过调用chew函数的uf别名来引用eat函数。欢迎来到Python。