سؤال

سآخذ نظرة على كيفية نموذج النظام في جانغو يعمل و لاحظت شيء أنا لا أفهم.

وأنا أعلم أن خلق لكم فارغة __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

من خارج الحزمة لا تزال تبدو بالضبط كما كان من قبل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top