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