簡體   English   中英

在python中導入模塊的最pythonic方法是什么

[英]What is the most pythonic way to import modules in python

任何人都可以建議我在python中導入模塊的最pythonic方式是什么? 讓我解釋一下 - 我已經閱讀了很多python代碼,並找到了幾種不同的方法來導入模塊,或者更精確 - 何時導入:

  1. 使用一個模塊/幾個模塊,其中包括整個項目所需的所有導入(第三方模塊),因此所有導入都集中在少數模塊中,因此很容易維護導入。 當任何單個模塊需要導入任何模塊時,請詢問參考模塊。 例如,在我們的項目中,我們將名為'references'的級別分開,因此它包含'system.py'(包含對所有系統庫的引用),'platform.py'(包含對所有平台庫的引用)等模塊,'devexpress.py' '(包含對所有devexpress庫的引用)等。 這些模塊看起來像:
  2. 每個模塊都在模塊的頂部導入所有必需的類和函數 - 例如,在項目的每個模塊中都有一個導入部分
  3. 每個函數/類在本地使用導入,例如在定義之后,僅導入他們真正需要的東西。

請在下面找到樣品。

1個示例導入模塊 - 只有'import'和'from ... import ...'語句(沒有任何方法或類):

#references.py
import re
import clr
import math

import System
import System.Text.RegularExpressions
import System.Random
import System.Threading
import System.DateTime

# System assemblies

clr.AddReference("System.Core")
clr.AddReference("System.Data")
clr.AddReference("System.Drawing")
...

#test.py
from references.syslibs import (Array, DataTable, OleDbConnection, OleDbDataAdapter,
                                 OleDbCommand, OleDbSchemaGuid)

def get_dict_from_data_table(dataTable):
    pass

2個模塊帶有'import'和'from ... import ...'以及方法和類:

from ... import ...
from ... import ...

def Generate(param, param1 ...):
    pass

3模塊帶有'import'和'from ... import ...'語句,這些語句在方法和類中使用:

import clr
clr.AddReference("assembly")       

from ... import ...
...

def generate_(txt, param1, param2):
  from ... import ...
  from ... import ...
  from ... import ...

  if not cond(param1): res = "text"
  if not cond(param2): name = "default"

那么在python中導入模塊的最pythonic方法是什么?

真的沒關系,只要你不from ... import * 其余的都是品味和解決循環導入問題。 PEP 8指出你應該在腳本的頂部導入,但即使這樣也不是一成不變的。

人們已經評論了主要的樣式問題(在腳本的頂部等),所以我會跳過它。

對於我的導入,我通常按模塊名稱按字母順序排序(無論是'import'還是'from ... import ...'。我將它分成以下組:標准庫;第三方模塊(來自pypi或其他);內部模塊。

import os
import system

import twisted
import zope

import mymodule_1
import mymodule_2

Python的“import”將Python模塊加載到它自己的命名空間中,因此您必須在引用模塊中的任何名稱的引用前添加模塊名稱后跟一個點

import animals
animals.Elephant()

“from”將Python模塊加載到當前名稱空間中,以便您可以引用它而無需再次提及模塊名稱

from animals import Elephant
Elephant()

要么

from animals import *
Elephant()

使用from很好,(但使用通配符導入是令人沮喪的)。 但是如果你有一個大規模的項目,從不同的模塊導入可能會導致命名密集。 像從兩個不同的模塊導入Elephant()函數會導致問題(比如使用帶*的通配符導入)

因此,如果您有一個大型縮放項目,從其他模塊導入許多不同的東西,最好使用import並使用module_name.your_class_or_function導入的東西。 否則,請使用符號...

不要使用from module import * 這將污染命名空間,並且非常不滿意。 但是,您可以使用from導入特定的東西; from module import something 這使命名空間保持干凈。 在較大的項目中,如果使用通配符,則可以將2 foo或2 bar導入到同一名稱空間中。

PEP 8表示在不同的生產線上進口。 例如:

import os
import sys
import yourmodule
from yourmodule import specific_stuff

我做的一件事是將我的導入按字母順序分為兩組。 一個是標准/第三方,第二個是內部模塊。

暫無
暫無

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

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