سؤال

في بعض تطبيقات جانغو بلدي أنا باستخدام settings_local.py ملف لتجاوز الإعدادات التي تختلف في بيئات مختلفة (على سبيل المثال.التطوير والاختبار والإنتاج).لقد استخدمت في الأصل الكود التالي لتضمين محتوياته في settings.py:

try:
    from settings_local import *
except ImportError:
    sys.stderr.write("The settings_local.py file is missing.\n")
    DEBUG=False

لقد وجدت مؤخرا execfile وظيفة وتحولت إلى شيء مثل:

try:
    execfile(path.join(PROJECT_ROOT, "settings_local.py"))
except IOError:
    sys.stderr.write("The settings_local.py file is missing.\n"
    DEBUG=False

كلا العمل على النحو المنشود ، ولكن أنا الغريب ما إذا كنت في عداد المفقودين أي غوتشاس ، وبشكل عام النهج الذي هو أكثر الموصى بها ولماذا.

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

المحلول

باستخدام execfile وظيفة يؤدي إلى تقييم الملف المصدر بيثون (الحمر) في كل مرة يتم تقييم ملف الإعدادات.أنت تقوم بتنفيذ محلل بايثون في كل مرة.باستخدام import لن تفعل هذا بالضرورة (قد تستخدم .ملف بيك).عموما في المرة الأولى التي تقوم بتشغيل مشروع في بيثون (على الأقل ، كبيثون) يحصل على تجميعها إلى بايت كود وليس إعادة تجميعها مرة أخرى.أنت تكسر ذلك.هذه ليست بالضرورة مشكلة ، ولكن يجب أن تكون على علم بها.

باستخدام execfile سيؤدي أيضا إلى جميع الواردات التي قد تكون لديك في settings_local.py يتم إعادة تقييم الملف في نطاق الوحدة النمطية لـ settings.py ملف.باستخدام import * كان من الممكن تضمين جميع العناصر في settings_local.py نطاق الوحدة.التأثير الصافي هو نفسه (جميع العناصر المدرجة في settings_local.py يتم تضمين نطاق الوحدة في settings.py) لكن الطريقة مختلفة.

أخيرا ، من الطبيعي أن يتم تنفيذ الوحدات كوحدات نمطية بدلا من تضمينها.من المعقول أن تتضمن الشفرة أشياء مثل os.path.dirname(__file__).إذا استخدم أي رمز هذا ، فستخلط بينه لأن الكود لن يتم تنفيذه في الوحدة النمطية التي قد يتوقعها المؤلف بشكل معقول.

في تجربتي ، يستخدم الناس import لا execfile.جانغو هو كثيرا 'الاتفاقية على التكوين'.اتبع الاتفاقية.

نصائح أخرى

فرق آخر:إكسيكفيل يحصل على قاموس السياق;السياق العام افتراضيا أو قاموس محدد.هذا يمكن أن يسمح ببعض الأشياء الغريبة

dont_do_this.py:

# Probably not a good thing to do
z=x+1  # an expression that involves an un-defined field

بوضوح,

from dont_do_this import *

فشل.

ومع ذلك,

d={'x':1}
execfile( 'dont_do_this.py', d )

على ما يرام والنتائج في d=={'x':1, 'z':2}

لاحظ أن

x=1
execfile( 'dont_do_this.py' )

على ما يرام والنتائج في المتغير z تضاف إلى الكرة الأرضية.

النسخة الأولى (from settings_local import *) هو ما يتوقع الجميع رؤيته.سيسمح أيضا لمحللات الكود بالعثور على الوحدة.

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