كيف يفعل المرء ما يعادل "استيراد * من وحدة" مع بايثون __الاستيراد__ وظيفة ؟

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

  •  02-07-2019
  •  | 
  •  

سؤال

وبالنظر إلى سلسلة مع اسم وحدة ، كيف يمكنك استيراد كل شيء في وحدة كما لو كنت قد يسمى:

from module import *

أينظرا string S="وحدة" ، كيف يمكن للمرء الحصول على المعادلة التالية:

__import__(S, fromlist="*")

هذا لا يبدو أن تنفيذ كما هو متوقع (كما أنها لا تستورد شيئا).

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

المحلول

الرجاء إعادة النظر.الشيء الوحيد الأسوأ من import * هو السحر import *.

إذا كنت تريد حقا أن:

m = __import__ (S)
try:
    attrlist = m.__all__
except AttributeError:
    attrlist = dir (m)
for attr in attrlist:
    globals()[attr] = getattr (m, attr)

نصائح أخرى

هنا هو بلدي الحل الديناميكي التسمية المحلية إعدادات ملفات جانغو.ملاحظة إضافة أدناه من التحقق من أن لا تشمل السمات التي تحتوي على '__' من استيراد الملف.على __name__ العالمي كان يتم تجاوزها مع وحدة اسم الإعدادات المحلية الملف الذي تسبب setup_environ(), المستخدمة في manage.py أن يكون لديك مشاكل.

try:
    import socket
    HOSTNAME = socket.gethostname().replace('.','_')
    # See http://docs.python.org/library/functions.html#__import__
    m = __import__(name="settings_%s" % HOSTNAME, globals=globals(), locals=locals(), fromlist="*")
    try:
        attrlist = m.__all__
    except AttributeError:
        attrlist = dir(m)        
    for attr in [a for a in attrlist if '__' not in a]:
        globals()[attr] = getattr(m, attr)

except ImportError, e:
    sys.stderr.write('Unable to read settings_%s.py\n' % HOSTNAME)
    sys.exit(1)

المشكلة الأساسية هي أنني النامية بعض جانغو, ولكن في أكثر من مضيف واحد (مع الزملاء) ، مع إعدادات مختلفة.كنت أتمنى أن تفعل شيئا مثل هذا في project/settings.py ملف:

from platform import node

settings_files = { 'BMH.lan': 'settings_bmh.py", ... } 

__import__( settings_files[ node() ] )

يبدو الحل بسيط (وهكذا أنيقة), ولكن أود أن نتفق على أنه له رائحة و بساطة يخرج حلقة عندما يكون لديك لاستخدام المنطق مثل ما جون Millikin نشر (شكرا).هنا أساسا الحل ذهبت مع:

from platform import node

from settings_global import *

n = node()

if n == 'BMH.lan':
  from settings_bmh import *
# add your own, here...
else:
  raise Exception("No host settings for '%s'. See settings.py." % node())

الذي يعمل بشكل جيد لأغراضنا.

ويبدو أنه يمكنك أيضا استخدام dict.تحديث() على وحدة القواميس في حالة:

config = [__import__(name) for name in names_list]

options = {}
for conf in config:
    options.update(conf.__dict__)

تحديث: أعتقد أن هناك قصيرة "وظيفية" نسخة منه:

options = reduce(dict.update, map(__import__, names_list))

لم أجد وسيلة جيدة للقيام بذلك حتى أخذت أبسط ولكن الطريقة البشعة من http://www.djangosnippets.org/snippets/600/

try:
    import socket
    hostname = socket.gethostname().replace('.','_')
    exec "from host_settings.%s import *" % hostname
except ImportError, e:
    raise e
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top