Странное поведение перезагрузки модуля в spyder или IPython - PullRequest
0 голосов
/ 19 сентября 2019

У меня проблема с повторным запуском скрипта в spyder, который динамически табулирует некоторые свои собственные атрибуты.

Вот минимальный пример, представляющий то, что я делаю.У меня есть исходный скрипт, который я запускаю с помощью обычной команды Run (F5).Он работает в том же каталоге, в котором он находится:

runfile('C:/some/path/test.py', wdir='C:/some/path')

test.py

import sys

def x():
    pass

def y():
    pass

x.add = y.add = True

if __name__ == '__main__':
    a = [obj for obj in tuple(sys.modules[__name__].__dict__.values())
                if getattr(obj, 'add', False)]
    print(a)

Я могу перезапустить этот скрипт пару раз,и всегда получаю один и тот же ожидаемый результат:

[<function x at 0x0000025E793DBD90>, <function y at 0x0000025E793DB598>]

Я ожидаю, что если я изменю имя одной из функций, скажем, с x на f, а присвоение атрибута на f.add = y.add = TrueЯ бы получил тот же результат, но с x изменилось на f.Вместо этого я получаю

[<function x at 0x0000025E793DB510>, <function y at 0x0000025E793DBBF8>, <function f at 0x0000025E793DBA60>]

Учитывая, что новая функция f отображается в списке, но старая x все еще там, я думаю, что кэш модуля для скрипта неочищается правильно.

Я вручную очищал рабочее пространство с помощью кнопки ластика на консоли, но я чувствую, что должно быть лучшее решение или, по крайней мере, объяснение того, что происходит.Возможно, это проблема UMR?

Я использую Spyder 3.3.3 со следующим: Python 3.7.3 64-bit |Qt 5.9.6 |PyQt5 5.9.2 |Windows 10, IPython 7.4.9

1 Ответ

2 голосов
/ 19 сентября 2019

Это функция в Spyder, которая специально создана для того, чтобы позволить вам продолжать работу с остановочных точек, особенно при рассмотрении более продолжительных периодов времени для генерации конкретных результатов, а также включает функцию переменный проводник .

Существует способ обойти это, хотя, следуя инструкциям в этот ответ до Очистите все переменные перед каждым запуском или перезапустив.

Однако, как roganjosh , очистка пространства имен не обязательно лучше.

Вы можете запустить функцию, которая займет 10 минут, чтобы обработать данные и вернуть их к глобальному имени, а затем простохешируйте эту функцию, вызывайте ее для каждого последующего запуска и никогда не тратите время обработки снова (пока вы не очистите пространство имен).

Если вы хотите сбросить только одну или группу переменных, вы можете использовать reset_selective

%reset_selective [-f] regex
...