Python模块使用导入前定义的函数

时间:2017-09-25 17:54:01

标签: python python-import

我想在一个单独的文件中定义一堆命令以便整理。

def cmd1():
    print("calling cmd1")

import define_cmd2

cmd2()

然后是define_cmd2.py:

cmd1()

def cmd2():
    print("called cmd2")

它告诉我cmd1()未定义。如何调用import以便我可以在导入调用之前使用/编辑/调用定义的内容?

2 个答案:

答案 0 :(得分:0)

python文件(例如define_cmd2.py)应该是自包含的。一个非常基本的要求是,如果你想使用一个名为cmd1的函数,它必须在define_cmd2.py或在调用函数之前导入的某个文件中定义。

然而,这听起来更像XY problem。你究竟想做什么?

答案 1 :(得分:0)

首先应该了解Python导入的工作原理。

在模块上调用import第一次时间,它会被执行。生成的命名空间包含所有函数和变量定义,用于创建在命名空间中引用的模块对象,以及sys.modules中引用的模块对象。下次导入时,导入仅引用sys.modules中的现有模块。

为避免循环导入导致的错误,在运行代码之前,实际上首先创建模块对象,以便进一步导入已经在sys.modules中看到现有模块,而不是尝试重新执行代码一遍又一遍。

在您的特定情况下,如果您要使用define_cmd2的内容,则需要从define_cmd1明确导入define_cmd1。其次,您需要正确引用导入的名称:

<强> define_cmd1

def cmd1():
    print("calling cmd1")

import define_cmd2

define_cmd2.cmd2()

<强> define_cmd2

import define_cmd1

import define_cmd1.cmd1()

def cmd2():
    print("called cmd2")

粗体项是您需要添加的代码。

澄清一下,运行define_cmd时会发生什么:

  1. def语句将创建一个函数define_cmd1.cmd1
  2. import将尝试加载define_cmd2
  3. import中的define_cmd2将不会执行任何操作,因为sys.modules['define_cmd1']已经存在,这意味着它已加载或正在加载。
  4. define_cmd1.cmd1()将会运行。
  5. def语句将创建一个函数define_cmd2.cmd2
  6. 返回加载define_cmd1
  7. 运行define_cmd2.cmd2