内联 django shell 与 python shell 中的变量范围

Posted

技术标签:

【中文标题】内联 django shell 与 python shell 中的变量范围【英文标题】:Variables scope in inline django shell, vs python shell 【发布时间】:2013-08-03 14:18:41 【问题描述】:

我有问题,django shell 的奇怪行为。我有这个代码:

fields = ('name', 'description', 'long_description', 'foot_description')
a = 1
dict( (field, a) for field in fields)

当我从 python shell 运行它时,它给了我正确的 dict。但是当我从 django shell 运行它时,我得到:

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
/usr/local/lib/python2.7/dist-packages/django/core/management/commands/shell.pyc in     <module>()
----> 1 dict( (field, a) for field in fields)

/usr/local/lib/python2.7/dist-packages/django/core/management/commands/shell.pyc in    <genexpr>((field,))
----> 1 dict( (field, a) for field in fields)

NameError: global name 'a' is not defined

我的问题很简单:为什么?

【问题讨论】:

似乎无法在我的 shell 上复制它。 :// 我可以在 Django 1.3 IPython shell 中复制这个错误。 @aychedee 我不能……Out[3]: 'description': 1, 'foot_description': 1, 'long_description': 1, 'name': 1 @OP:你用的是什么版本?我无法在 Django 1.5 上复制它。 我可以在 Django 1.4.1 IPython shell 和 Django IPython shell 1.3.7 上复制它。 【参考方案1】:

好像是a known issue and fixed in Django 1.6。

目前,工单中有一个建议的解决方法。 “抓住以下几行(从这里https://github.com/django/django/blob/master/django/core/management/commands/shell.py)并用这个替换当前的实现(...):

def ipython(self):
    try:
        from IPython.frontend.terminal.ipapp import TerminalIPythonApp
        app = TerminalIPythonApp.instance()
        app.initialize(argv=[])
        app.start()
    except ImportError:
        # IPython < 0.11
        # Explicitly pass an empty list as arguments, because otherwise
        # IPython would use sys.argv from this script.
        try:
            from IPython.Shell import IPShell
            shell = IPShell(argv=[])
            shell.mainloop()
        except ImportError:
            # IPython not found at all, raise ImportError
            raise

您也可以通过对同一张票的评论尝试python manage.py shell --plain

【讨论】:

以上是关于内联 django shell 与 python shell 中的变量范围的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Python/Django 在电子邮件中发送内联图像? [复制]

如何使用 Python/Django 在电子邮件中发送内联图像? [复制]

python Django:验证主要表单中的内联表单

相关内联上的python django list_display [重复]

Django 管理员内联:select_related

django admin 内联(和嵌套内联):我怎样才能获得这个功能?