إضافة رمز إلى __ _ init__.py
-
02-07-2019 - |
سؤال
سآخذ نظرة على كيفية نموذج النظام في جانغو يعمل و لاحظت شيء أنا لا أفهم.
وأنا أعلم أن خلق لكم فارغة __init__.py
ملف تحديد هذا الدليل الحالي هو حزمة.و التي يمكنك ضبط بعض المتغير في __init__.py
بحيث استيراد * يعمل بشكل صحيح.
ولكن جانغو يضيف مجموعة من ...استيراد ...البيانات و يحدد مجموعة من الطبقات في __init__.py
.لماذا ؟ ليس هذا فقط جعل الأمور تبدو الفوضى ؟ هل هناك سبب أن يتطلب هذا الرمز في __init__.py
?
المحلول
جميع الواردات في __init__.py
متاحة عند استيراد حزمة (الدليل) الذي يحتوي عليه.
على سبيل المثال:
./dir/__init__.py
:
import something
./test.py
:
import dir
# can now use dir.something
تحرير:نسيت أن أذكر التعليمات البرمجية في __init__.py
يعمل في المرة الأولى تقوم باستيراد أي وحدة من هذا الدليل.حيث أنها عادة جيدة مكان لوضع أي حزمة المستوى initialisation رمز.
EDIT2:dgrant أشار إلى التباس في بلدي على سبيل المثال.في __init__.py
import something
يمكن استيراد أي وحدة لا يلزم من الحزمة.على سبيل المثال ، يمكننا استبدالها import datetime
, ثم في أعلى مستوى test.py
كل من هذه القصاصات سوف تعمل:
import dir
print dir.datetime.datetime.now()
و
import dir.some_module_in_dir
print dir.datetime.datetime.now()
خلاصة القول هي:جميع الأسماء المعينة في __init__.py
, سواء المستوردة وحدات أو الوظائف أو فئات ، هي متوفرة تلقائيا في حزمة مساحة كلما استيراد مجموعة أو وحدة في الحزمة.
نصائح أخرى
انها مجرد تفضيل شخصي حقا ، مع تخطيط وحدات بيثون.
دعونا نقول لديك وحدة تسمى erikutils
.هناك نوعان من الطرق التي يمكن أن يكون وحدة ، إما أن يكون لديك ملف يسمى erikutils.py على sys.path
أو لديك دليل يسمى erikutils على sys.path
مع فارغة __init__.py
الملف داخله.ثم دعونا نقول لديك مجموعة من وحدات تسمى fileutils
, procutils
, parseutils
وكنت أريد أن تكون هذه وحدات فرعية تحت erikutils
.لذلك يمكنك كسب بعض .تسمى ملفات py fileutils.py, procutils.py, ، parseutils.py:
erikutils
__init__.py
fileutils.py
procutils.py
parseutils.py
ربما لديك عدد قليل من الوظائف التي لا تنتمي في fileutils
, procutils
, أو parseutils
وحدات.و دعونا نقول كنت لا تشعر مثل إنشاء وحدة نمطية جديدة تسمى miscutils
.و كنت أود أن تكون قادرة على استدعاء الدالة كما يلي:
erikutils.foo()
erikutils.bar()
بدلا من القيام
erikutils.miscutils.foo()
erikutils.miscutils.bar()
ذلك لأن erikutils
الوحدة هي الدليل ، وليس ملف ، يجب أن تحدد ذلك في وظائف داخل __init__.py
الملف.
في جانغو ، وأفضل مثال على ذلك يمكن أن نفكر من هو django.db.models.fields
.كل جانغو *الحقل فئات محددة في __init__.py
الملف في جانغو/db/نماذج/الميادين الدليل.أعتقد أنها فعلت ذلك لأنها لا تريد أن يحشر كل شيء في افتراضية django/db/models/fields.py نموذج ، حتى أنها تقسيمه إلى عدد قليل من الوحدات الفرعية (related.py, files.py, على سبيل المثال) وهي تمسك جعلت *مجال التعاريف في مجالات الوحدة نفسها (وبالتالي ، __init__.py
).
باستخدام __init__.py
الملف يسمح لك لجعل الداخلية حزمة هيكل غير مرئية من الخارج.إذا كان الهيكل الداخلي التغييرات (مثلا ، لأنك تقسيم واحد من الدهون النمطية إلى) لديك فقط لضبط __init__.py
ولكن ليس التعليمات البرمجية التي تعتمد على الحزمة.يمكنك أيضا جعل أجزاء من الحزمة الخاصة بك غير مرئية مثلإذا لم تكن على استعداد من أجل الاستخدام العام.
لاحظ أنه يمكنك استخدام del
الأمر, حتى نموذجية __init__.py
قد تبدو مثل هذا:
from somemodule import some_function1, some_function2, SomeObject
del somemodule
الآن إذا كنت ترغب في تقسيم somemodule
الجديد __init__.py
قد يكون:
from somemodule1 import some_function1, some_function2
from somemodule2 import SomeObject
del somemodule1
del somemodule2
من خارج الحزمة لا تزال تبدو بالضبط كما كان من قبل.