簡體   English   中英

python共享全局模塊變量問題

[英]python shared global module variable issue

我正在為Django項目編寫小型應用程序。 這個想法是創建某種小部件-可以通過包含標簽添加到模板中以顯示一些備用信息(例如博客記錄,快速鏈接列表,菜單等)的小視圖功能。 為此,我想創建類似於默認templatetag注冊機制的內容。 通常,我需要以下組件:

  • 定制裝飾器以注冊這些視圖功能
  • 某些功能在啟動時會在所有已安裝的應用程序(現在為“ widgets.py”)中搜索特定模塊(可能從settings.py調用)

我現在寫的是這樣的:

# -*- coding: utf-8 -*-


REGISTERED_WIDGETS = []

class Library(object):
    """
    Utility class for registering defined widgets
    """
    def widget(self, view=None, name=None, form_class=None):
        if name is None:
            name = view.__name__
        def decorator(view):
            print 'registering', view
            REGISTERED_WIDGETS.append((view, name, form_class))
            def wrapper(request, *args, **kwargs):
                return view(request, *args, **kwargs)
            return wrapper
        if view is not None:
            return decorator(view)
        else:
            return decorator

def search_widgets():
    """
    Search for 'widgets.py' modules inside installed applications and import them,
    hence initializing its registration
    """
    from django.conf import settings

    for app in settings.INSTALLED_APPS:
        try:
            module = __import__(app + '.widgets')
            print module
        except ImportError:
            pass
        else:
            print 'Imported widgets from ', app

if __name__ == '__main__':
    search_widgets()
    print REGISTERED_WIDGETS

為了測試它,我在一個應用程序的widgets.py中添加了這個存根控件:

# -*- coding: utf-8 -*-

from experiments.widgets.base import Library

register = Library()

@register.widget(name='dummy')
def dummy_widget(request):
    pass

我現在遇到了一個愚蠢的問題-運行此模塊時,我想看到的是Registered_WIDGETS變量中充滿了找到的小部件,但它是空的。 實際上,我看到以下輸出:

>>> %run widgets/base.py
<module 'django' from '/usr/lib/python2.7/dist-packages/django/__init__.pyc'>
Imported widgets from  django.contrib.admin
registering <function dummy_widget at 0x364f320>
<module 'experiments' from '/home/east825/Development/pycharm-experiments/experiments/../experiments/__init__.pyc'>
Imported widgets from  experiments.layout
[]

似乎我忘記了有關python共享全局變量行為的一些重要信息。 有什么建議嗎?

您的模塊base.py是否有可能被導入兩次?

在base.py的開頭添加帶有“ print'base.py executed'”之類的打印內容。

編輯:甚至更好,打印id(register_WIDGETS)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM