كيفية العثور على جميع الوحدات الفردية في بيثون؟

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

سؤال

في حين أنها تافهة إلى حد ما في Python لاستيراد وحدة "الطفل" في وحدة نمطية أخرى وقائمة سماتها، يصبح أكثر صعوبة قليلا عندما تريد استيرادها الكل وحدات الطفل.

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

ما هي أسهل طريقة لاستكشاف جميع الوحدات النمطية؟

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

المحلول

نصائح أخرى

أعتقد أن أفضل طريقة للقيام بهذا النوع من الشيء البرنامج المساعد يستخدم entry_points و ال API لاستعلامهم.

عندما كنت طيبا، ابدأ بالبرمجة في بيثون كتبت هذا لبلدي روبوت IRC المعياري:


    # Load plugins

    _plugins = []

    def ifName(name):
        try:
            return re.match('([^_.].+)\.[^.]+', a).group(1)
        except:
            return None

    def isValidPlugin(obj):
        from common.base import PluginBase
        try:
            if obj.__base__ == PluginBase:
                return True
            else:
                return False
        except:
            return False

    plugin_names = set(ifilter(lambda a: a!=None, [ifName(a) for a in os.listdir(os.path.join(os.getcwd(), 'plugins'))]))
    for plugin_name in plugin_names:
        try:
            plugin = __import__('plugins.'+plugin_name, fromlist=['plugins'])
            valid_plugins = filter(lambda a: isValidPlugin(a), [plugin.__getattribute__(a) for a in dir(plugin)])
            _plugins.extend(valid_plugins)
        except Exception, e:
            logger.exception('Error loading plugin %s', plugin_name)

    # Run plugins

    _plugins = [klass() for klass in _plugins]

إنها غير آمنة أو "أيمن"، ولكن ربما سنكون مفيدة مع ذلك. إنه جدا الرمز القديم بحيث لا تضربني.

الحل فوق عبور ملفات الملفات لإيجاد نقل الأسفل هو موافق طالما قمت بتطبيق كل مكون إضافي كوحدة تستند إلى نظام الملفات.

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

تذكر: "صريح أفضل من الضمنية" هو جزء من زن بيثون.

يمكنك المحاولة globBing الدليل:

import os
import glob

modules = glob.glob(os.path.join('/some/path/to/modules', '*.py'))

ثم يمكنك محاولة استيرادها:

checked_modules
for module in modules:
    try:
        __import__(module, globals(), locals()) # returns module object
    except ImportError:
        pass
    else:
        checked_modules.append(module)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top