簡體   English   中英

從包中導入所有函數:“from。* import *”

[英]Importing all functions from a package: “from .* import *”

目標

我希望能夠從我的包中的每個文件導入(在__init__.py )所有函數。

用法

例如在此文件夾結構中。

manage.py
- scripts/
   -- __init__.py
   -- tests.py
   -- deploy.py

我目前正在做以下事情:

manage.py:

from scripts import *

script / init .py:

from .tests import *
from .deploy import *

但是,每次我向包中添加另一個文件時,我必須在script/__init__.py上添加一個導入行,這有點煩人。

你可以手動完成,但你不應該這樣做

為什么你真的不想這樣做:

你最終會得到一個命名空間,在這個命名空間中,理解什么是什么以及它來自哪里將是非常困難的,隨着整個項目的規模的增加,難度會增加。 對於完全不直觀的Python,想想任何可能會查看你的代碼的人,或者更糟糕的是,想想你自己在1個月后重讀它而不記得發生了什么。 你生命中不需要這樣。

除此之外,您向導入器公開的任何可能與其他模塊中的其他函數重疊的函數都會被最新導入的函數所欺騙。 舉個例子,想想兩個包含相同函數foo()腳本,看看會發生什么。

>>> from scrpt1 import *
>>> foo()
Script 1
>>> from scrpt2 import *
>>> foo()
Script 2

生活中也不需要那樣。 特別是當它通過明確而很容易繞過時。


以下是import this包含的文本中的一些相關行:

顯式優於隱式。

明確你的函數定義的地方。不要“代表”你的代碼。 如果你選擇在一個地方選擇所有東西的網格,你會想要在將來打自己。

特殊情況不足以打破規則。

真的自我解釋。

命名空間是一個很棒的主意 - 讓我們做更多的事情吧!

“更多的那些!” , 不低於; 不要錯過命名空間的精彩程度。 Python基於它們; 將代碼隔離在不同的命名空間中是組織代碼的基礎。

  1. importlib允許您從字符串名稱導入任何Python模塊。 您可以通過路徑中的文件列表自動執行它。

  2. 使用__all__更加pythonic。 點擊此處了解更多詳情。

暫無
暫無

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

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