gpt4 book ai didi

python共享全局模块变量问题

转载 作者:行者123 更新时间:2023-12-04 17:04:42 25 4
gpt4 key购买 nike

我正在为我的 Django 项目编写小应用程序。这个想法是创建某种小部件 - 可以通过包含标签添加到模板中的小 View 功能,以显示一些附加信息(例如博客记录、快速链接列表、菜单等)。我想创建类似于默认的东西 templatetag为此目的的注册机制。通常我需要以下组件:

  • 自定义装饰器来注册这些 View 函数
  • 某些功能会在启动时在所有已安装的应用程序(现在是“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 中添加了这个 stub 小部件:
    # -*- 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 的开头添加一个打印,带有“打印 'base.py 执行'”之类的。

    编辑:甚至更好,打印 id(REGISTERED_WIDGETS)

    关于python共享全局模块变量问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10921717/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com