هل يمكنني استخدام __init__.py لتحديد المتغيرات العالمية؟

StackOverflow https://stackoverflow.com/questions/1383239

سؤال

أريد تحديد ثابت يجب أن يكون متاحًا في جميع النسيج الفرعي للحزمة. لقد اعتقدت أن أفضل مكان سيكون فيه في __init__.py ملف حزمة الجذر. لكني لا أعرف كيف أفعل هذا. لنفترض أن لدي بعض الحالات الفرعية ولكل منها عدة وحدات. كيف يمكنني الوصول إلى هذا المتغير من هذه الوحدات؟

بالطبع ، إذا كان هذا خطأً تمامًا ، وهناك بديل أفضل ، أود أن أعرف ذلك.

هل كانت مفيدة؟

المحلول

يجب أن تكون قادرًا على وضعها في __init__.py. يتم ذلك طوال الوقت.

mypackage/__init__.py:

MY_CONSTANT = 42

mypackage/mymodule.py:

from mypackage import MY_CONSTANT
print "my constant is", MY_CONSTANT

ثم ، استيراد mymodule:

>>> from mypackage import mymodule
my constant is 42

ومع ذلك ، إذا كان لديك ثوابت ، فسيكون من المعقول (أفضل الممارسات ، على الأرجح) وضعها في وحدة نمطية منفصلة (constants.py ، config.py ، ...) ثم إذا كنت تريدها في مساحة اسم الحزمة ، استيراد معهم.

mypackage/__init__.py:

from mypackage.constants import *

ومع ذلك ، لا يتضمن هذا تلقائيًا الثوابت في مساحات أسماء وحدات الحزمة. لا يزال يتعين على كل وحدة من الوحدات في الحزمة استيراد الثوابت بشكل صريح إما من mypackage او من mypackage.constants.

نصائح أخرى

لا يمكنك فعل ذلك. سيتعين عليك استيراد ثوابتك بشكل واضح في مساحة اسم كل وحدة فردية. أفضل طريقة لتحقيق ذلك هي تحديد ثوابتك في وحدة "التكوين" واستيرادها في كل مكان تحتاجه:

# mypackage/config.py
MY_CONST = 17

# mypackage/main.py
from mypackage.config import *

يمكنك تحديد المتغيرات العالمية من أي مكان ، لكنها فكرة سيئة حقًا. استيراد __builtin__ الوحدة النمطية وتعديلها أو إضافة سمات إلى هذه الوحدات ، وفجأة لديك ثوابت أو وظائف جديدة مدمجة. في الواقع ، عندما يقوم طلبي بتثبيت GetText ، أحصل على وظيفة _ () في جميع الوحدات النمطية ، دون استيراد أي شيء. لذلك هذا ممكن ، ولكن بالطبع فقط لمشاريع نوع التطبيق ، وليس للحزم أو الوحدات النمطية القابلة لإعادة الاستخدام.

وأعتقد أن لا أحد سيوصي بهذه الممارسة على أي حال. ما الخطأ في مساحة الاسم؟ يحتوي التطبيق المذكور على وحدة الإصدار ، بحيث يكون لدي متغيرات "عالمية" متاحة مثل version.VERSION, version.PACKAGE_NAME إلخ.

أردت فقط إضافة أنه يمكن استخدام الثوابت باستخدام ملف config.ini وتوحله في البرنامج النصي باستخدام مكتبة ConfloSparser. بهذه الطريقة يمكن أن يكون لديك ثوابت لظروف متعددة. على سبيل المثال ، إذا كان لديك ثوابت معلمة لطلب اثنين منفصلين عن عنوان URL ، فقط قم بتسمية ذلك مثل:

mymodule/config.ini
[request0]
conn = 'admin@localhost'
pass = 'admin'
...

[request1]
conn = 'barney@localhost'
pass = 'dinosaur'
...

لقد وجدت الوثائق على موقع Python مفيدًا جدًا. لست متأكدًا مما إذا كانت هناك أي اختلافات بين Python 2 و 3 ، فإليك الروابط لكليهما:

لبيثون 3: https://docs.python.org/3/library/configparser.html#module-configparser

لبيثون 2: https://docs.python.org/2/library/configparser.html#module-configparser

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