Python模块:相互调用的函数

时间:2015-01-10 11:51:53

标签: python python-import execfile

我让自己很困惑。我有一组python函数,所有这些函数都集成在一个名为(让我们说)useful.py的文件中。然后我可以用

将模块读入我的ipython
 import useful as uf

然后我可以使用

访问各个函数
 uf.meaning_of_life()

等等。标准的东西。

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

我可以通过简单地执行execfile('useful.py')来完全忽略所有这一点,但是我希望能够更好地处理模块系统。

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

我很欣赏这可能被解释为一个初学者问题,但我是从Matlab背景来看Python,我的自然倾向是使用execfile。信息指针非常受欢迎。

2 个答案:

答案 0 :(得分:2)

首先要了解的是,每个模块都是自己的本地命名空间。

如果您有这样的模块:

def chew():
    print('chewing')

def eat():
    print('eating')
    chew()

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

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

import useful as uf

uf.eat()

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

这是我们的观点。但是useful模块知道自己的一切。没有任何改变,它不需要导入自己来访问其内容,它不知道任何关于其他模块它没有{{1}编辑本身。

为了回答, import知道如何查找eat,因为它们位于同一模块中,因此位于同一范围中。

答案 1 :(得分:-1)

首先建议使用somefile导入定义作为一些东西,让我使用你的函数定义来给你一个清晰的图片。我会写简单的功能来吃和咀嚼。咀嚼会引用吃的东西。

useful.py

def eat():
    print 'Eaten'

def chew():
    eat()

主File.py代码

from useful import chew as uf

uf()

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