Python pdb лямбда-функция глобальная ошибка имени
Я тестировал исправление с помощью pdb.set_trace()
, чтобы убедиться, что он работает так, как я ожидал, перед его внедрением и продолжал получать странную ошибку.
(Pdb) test = [1,2,3,4,4,3,2,1]
(Pdb) max(range(len(test)),key=lambda i: test[i])
*** NameError: global name 'test' is not defined
Итак, я переехал в свою местную машину, чтобы убедиться, что смогу воспроизвести как можно проще, прежде чем обращаться за помощью. В ipython я получаю то же самое поведение.
In [1]: test = [1,2,3,4,4,3,2,1]
In [2]: max(range(len(test)),key=lambda i: test[i])
Out[2]: 3
In [3]: import pdb; pdb.set_trace()
--Call--
> /Users/tristanmatthews/anaconda/lib/python2.7/site-packages/IPython/core/displayhook.py(237)__call__()
-> def __call__(self, result=None):
(Pdb) test = [1,2,3,4,4,3,2,1]
(Pdb) max(range(len(test)),key=lambda i: test[i])
*** NameError: global name 'test' is not defined
Но в нормальной командной строке он работает отлично:
tristan:~$ python
Python 2.7.6 |Anaconda 1.8.0 (x86_64)| (default, Nov 11 2013, 10:49:09)
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> test = [1,2,3,4,4,3,2,1]
>>> max(range(len(test)),key=lambda i: test[i])
3
>>> import pdb; pdb.set_trace()
--Return--
> <stdin>(1)<module>()->None
(Pdb) test = [1,2,3,4,4,3,2,1]
(Pdb) max(range(len(test)),key=lambda i: test[i])
3
Если кто-нибудь знает, что здесь происходит, я бы ДЕЙСТВИТЕЛЬНО хотел бы знать.
Для записи исправление отлично работает в моем коде, просто не в отладчике.
Для справки мои версии python:
Исходная ошибка:
'2.7.3 (default, Apr 10 2013, 06:20:15) \n[GCC 4.6.3]'
Локальная машина и ipython и командная строка одинаковы:
In [5]: sys.version
Out[5]: '2.7.6 |Anaconda 1.8.0 (x86_64)| (default, Nov 11 2013, 10:49:09) \n[GCC 4.0.1 (Apple Inc. build 5493)]'
>>> sys.version
'2.7.6 |Anaconda 1.8.0 (x86_64)| (default, Nov 11 2013, 10:49:09) \n[GCC 4.0.1 (Apple Inc. build 5493)]'
Ответы
Ответ 1
Я могу подтвердить эту проблему с помощью Python 2.7. Существует отчет об ошибке для Python 3, в котором предлагается обходной путь: interact
в приглашении pdb
выводит вас в интерактивный сеанс, который заполняется globals()
и locals()
, а ваш lambda
должен работать как ожидалось.
Ответ 2
pdb
не является полной оболочкой python и перехватывает много вещей. Но добавление print
перед ним должно работать:
print max(range(len(test)),key=lambda i: test[i])