簡體   English   中英

從導入模塊中的父模塊調用函數

[英]Call function from parent module in imported 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()

您可以將函數作為參數傳遞:

測試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()

更多pythonic解決方案(IMHO)是這樣的:

文件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跳過import test2 ,因為test2已經是已知模塊。 在文件末尾, __name__不是__main__ ,並且if條件為false。 這個很重要! 導入不應有任何副作用。
  4. 控件返回到test2 ,其余文件被解析。
  5. 控件返回到test1 ,其余文件被解析。 這次滿足了文件底部的條件,因此主要部分的執行從one()開始

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM