0

I was doing some stuff in the Django console and I realized that the global variables are not recognized inside the lambda expression, for example if you execute the following code inside a python or even inside an iPython console it works perfectly:

a = 10
foo = lambda x: x + a
foo(10) # returns 20

But if you execute it inside the Django shell with iPython it doesn't work:

In [8]: foo = lambda x: x + a

In [9]: a = 10

In [10]: foo(10)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
/usr/local/lib/python2.7/dist-packages/django/core/management/commands/shell.pyc in <module>()
----> 1 foo(10)

/usr/local/lib/python2.7/dist-packages/django/core/management/commands/shell.pyc in <lambda>(x)
----> 1 foo = lambda x: x + a

NameError: global name 'a' is not defined

The iPython version 0.13.2

Thank you in advance!

EDIT

Event if I assign a before the lambda funciton the problem stills:

In [1]: a = 10

In [2]: foo = lambda x: x + a                                                                                                                                                                                                                  

In [3]: foo(10)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
/usr/local/lib/python2.7/dist-packages/django/core/management/commands/shell.pyc in <module>()
----> 1 foo(10)

/usr/local/lib/python2.7/dist-packages/django/core/management/commands/shell.pyc in <lambda>(x)
----> 1 foo = lambda x: x + a

NameError: global name 'a' is not defined

In [4]: 
───────────
4

1 に答える 1

3

他の人がここで遭遇したバグが発生している可能性があります。

https://github.com/ipython/ipython/issues/62#issuecomment-3854940

少し下のスレッドで説明されているように、バージョン 1.6 より前のバージョンでは、django はIPython.embed()関数を使用して ipython シェルを開始していました。これにより、ipython は個別のローカルおよびグローバル名前空間で開始することを強制されました。

django チームは、このコミットでこの問題を 1.6 で修正しました: https://github.com/django/django/commit/3570ff734e93f493e023b912c9a97101f605f7f5

Django の古いバージョン (この場合は 1.4.14) のバックポート修正は次のとおりです

IPython.embed()通常の python/ipython シェルを使用している場合でも、別の関数内で手動で呼び出す (クロージャーを作成する) と、この問題を再現できます。ipython 3.1.0 でテスト済み:

>>> from IPython import embed
>>> def test():
...     embed()
... 
>>> test()
Python 2.7.9 (default, Feb 10 2015, 03:28:08) 
Type "copyright", "credits" or "license" for more information.

IPython 3.1.0 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

In [1]: a = 10

In [2]: foo = lambda x: x+a

In [3]: foo(10)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-3-08cbc4a9df91> in <module>()
----> 1 foo(10)

<ipython-input-2-3ecd5afea150> in <lambda>(x)
----> 1 foo = lambda x: x+a

NameError: global name 'a' is not defined
于 2015-06-19T01:43:48.287 に答える