كيفية إضافة متغير إلى الوحدة التي استيرادها من؟

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

  •  19-09-2019
  •  | 
  •  

سؤال

ما أريد القيام به هو شيء مثل هذا:

template.py

def dummy_func():
    print(VAR)
# more functions like this to follow

fabfile.py
# this gets called by fabric (fabfile.org)
# safe to think of it as ant build.xml

import template
template.VAR = 'some_val'
from template import *

وهي أن لدي وحدة قالب وحدة أخرى يجب أن تقوم "تمديد" المساهمة بالمتغيرات المطلوبة. هل يمكن القيام بذلك بطريقة وظيفية (بدلا من ميراث الكائن)؟

تحرير: إضافة رمز أكثر قليلا.

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

المحلول

لست متأكدا مما تقصد به "بطريقة وظيفية" - هل تقصد، كما هو الحال في البرمجة الوظيفيةب لن يحدث ذلك (نظرا لأنك تحاول جوهري تعديل كائن، وهو عكس FP). أو هل تقصد شيئا مثل "طريقة تعمل"؟

للتفسير الأخير، المشكلة الكبيرة هي import * جزء - من بين العديد من المشاكل التي تشير إلى عدم استخدام ذلك، ستكون ستقوم بتشغيل صفعة في واحدة: إنها تنفذ لمحة من أي أسماء على مستوى الوحدة النمطية ملزمة في ذلك الوقت (أو فقط تلك المدرجة في __all__ في الوحدة النمطية، إذا كان ذلك محددا) - فلن ينعكس التغييرات المستقبلية في ربط الأسماء في الوحدات النمطية التي سبق لها import *.

لماذا تعتقد أنك بحاجة إلى دمج template_moduleمساحة الاسم في ذلك من وحدة الاستيراد؟ إذا كنت قد فعلت فقط العادية import template_module as tm, ، ثم ببساطة في اشارة الى جميع الأسماء ذات الصلة tm.this, tm.that سيعمل على ما يرام (بما في ذلك التقاط جميع التغييرات على الروابط حتى لحظة الاستخدام - بمعنى آخر، فإنه يستخدم نهج "الربط المتأخر" الذي يبدو أنك تتطلبه هنا).

نصائح أخرى

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

إنشاء ملف '/tmp/test1.py':

imoprt os
os.path = '' # set os.path (module) to a mere string
os.zzz = 'zzz'

ثم

cd /tmp && python

>>> dir(test)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'os', 'z']
>>> test.os
<module 'os' from '/usr/lib/python2.6/os.pyc'>
>>> test.os.path
''
>>> import os
>>> os.path
''
>>> os.zzz
'zzz'

الآن OS.Path هي سلسلة فارغة حتى في التطبيق الرئيسي، و ZZZ في كل مكان أيضا.

اتضح أن هذا لديه حل مركزي للنسيج.
لذلك لديك مجردة some__fab__template.py. و الخرد fabfile.py. يجب "تمديد" القالب المساهمة في بعض المتغيرات المطلوبة (مثل اسم المشروع).
لقد قمت بتنفيذها باستخدام Fab إرساء قاموس.
في ملف القالب env.VAR وفي "ملموسة" fabfile.py. أنت تفعل هذا:

from fabric.api import *
env.VAR = 'some value'
import some__fab__template

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