6

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

 import useful as uf

然后我可以使用

 uf.meaning_of_life()

等等。标准的东西。

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

我可以通过简单地做execfile('useful.py')一个完美的工作来忽略所有这些,但我想对模块系统有更多的了解。

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

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

4

2 回答 2

6

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

如果你有这样的模块:

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模块知道关于它自己的一切。那里没有任何改变,它不需要导入自己来访问它的内容,并且它不知道它自己没有编辑的其他模块的任何信息。import

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

于 2015-01-10T12:58:10.237 回答
0

首先,建议使用 from somefile import definition 作为一些东西,让我使用您的函数定义为您提供清晰的画面。我将编写简单的函数来吃和咀嚼。咀嚼将参考吃的地方。

有用的.py

def eat():
    print 'Eaten'

def chew():
    eat()

主文件.py 代码

from useful import chew as uf

uf()

通过调用 uf 别名来引用 eat 函数的咀嚼函数。欢迎来到蟒蛇。

于 2015-01-10T12:42:54.957 回答