簡體   English   中英

import module_name Vs __import __('module_name')

[英]import module_name Vs __import__('module_name')

我正在編寫一個python模塊,我正在使用許多其他不同模塊的導入。 我有點困惑,我是否應該在文件的開頭導入所有必要的依賴模塊,或者我是否應該在必要時進行。

我也想知道兩者的含義。

我來自C ++背景,所以我對此功能感到非常興奮,並且沒有看到任何不使用__import__()原因,僅在我的函數內部需要時導入模塊。

請注意這一點。

要編寫更少的代碼,請在腳本的第一行導入模塊,例如:

#File1.py
import os

#use os somewhere:
os.path.chdir(some_dir)
...
...
#use os somewhere else, you don't need to "import os" everywhere
os.environ.update(some_dict)

有時您可能需要在本地導入模塊(例如,在函數中):

abc=3
def foo():
  from some_module import abc #import inside foo avoids you from naming conflicts
  abc(...) #call the function, nothing to do with the variable "abc" outside "foo"

多次調用foo()時不要擔心時間消耗,因為import語句只加載模塊/函數一次。 導入模塊/函數后,該對象將存儲在字典sys.modules ,該字典是運行相同import語句時的加速查找表。

正如@bruno desthuilliers所提到的,導入insede函數可能不是pythonic,它違反了PEP8 ,這是我發現一個討論 ,你應該堅持在文件的頂部導入大部分時間。

首先, 通常不需要__import__ 它的主要目的是支持動態導入您不知道的事物(想想插件)。 您可以在函數內輕松使用import語句:

import sys

def foo():
    import this

if __name__ == "__main__":
    print sys.version_info
    foo()

預先導入所有東西的主要優點是它是最常見的 這是人們閱讀你的代碼將去看看是否導入的東西。 此外,您不需要在使用os 每個函數中編寫import os os 這種方法的主要缺點是:

  • 你可以讓自己陷入無法解決的進口循環( A進口B其中進口A
  • 即使您不打算使用它,也可以將所有內容都記入內存中。

第二個問題通常不是問題 - 您很少注意到導入的性能或內存影響。

如果遇到第一個問題,可能是代碼分組不良的症狀,應該將常見的東西考慮到AB都可以使用的新模塊C中。

首先,使用函數內部的導入違反了PEP8。 調用導入它是一個昂貴的調用即使模塊已經加載,所以如果你的函數被多次調用,這將不會補償性能增益。

另外當你調用“import test”python時這樣做:
dataFile = __ import __('test')

在文件頂部進口的唯一缺點就是根據文件的復雜性很快被污染的命名空間,但如果你的文件太復雜,那就是設計糟糕的信號。

暫無
暫無

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

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