从导入模块中的父模块调用函数

时间:2017-11-19 18:08:07

标签: python module

我有以下问题:我有一个带有一些已定义函数的.py文件,我导入了一个模块。从这个导入的模块我想从父模块调用一个函数。我该怎么做呢?我搜索了很多,但没有找到答案。这里有一些测试代码向您展示我的问题。

文件1:

from test2 import *

def one():
    print("one")
    pass

def two():
    print("two")
    print("now call function three from test one")

    three()


one()
two()

文件2:导入为模块

def three():
    print("three")
    print("now call function one from test 1")

    one()

2 个答案:

答案 0 :(得分:1)

您可以将函数作为参数传递:

测试1:

from test2 import *

def one():
    print("one")
    pass

def two():
    print("two")
    print("now call function three from test one")

    three(one)  # function one()


one()
two()

测试2:

def three(function):
    print("three")
    print("now call function one from test 1")

    function()

答案 1 :(得分:1)

更多pythonic解决方案(恕我直言)是这样的:

档案test1.py

import test2

def one():
    print("one")
    pass

def two():
    print("two")
    print("now call function three from test one")

    test2.three()

if __name__ == '__main__':
    one()
    two()

test2.py

import test1

def three():
    print("three")
    print("now call function one from test 1")

    test1.one()

然后python3 test1.py产生:

one
two
now call function three from test one
three
now call function one from test 1
one

是的,有一个循环导入。让我们一步一步看看它是如何工作的:

  1. test1__main__启动,因为这是Python用于启动程序的特殊保留名称。
  2. test1在第一行导入test2,因此解析将继续进行。
  3. test2依次导入test1,这就是为什么第一个文件从头开始再次解析,但现在以其真实名称解析。此时跳过import test2,因为test2已经是已知模块。在文件末尾,__name__不是__main__if条件为false。这个很重要!进口不应有任何副作用。
  4. 控制返回test2,文件的其余部分被解析。
  5. 控制返回到test1,解析文件的其余部分。这次满足文件底部的条件,因此主要部分的执行以one()
  6. 开头