Можно ли перезагрузить импортированные словари? - PullRequest
2 голосов
/ 07 апреля 2020

from module import _dict -> _dict['new_key'] = 1 - и теперь тот же импорт в другом файле импортирует _dict с ранее несуществующим ключом. Это проблема с pytest, который запускает несколько test*.py файлов, каждый мутирует _dict - например, test_b import _dict, измененный test_a.

Обходной путь - _dict = copy.deepcopy(_dict) перед мутирует - но предположим, что это нежелательно. importlib.reload(module) не будет перезагружаться _dict - сказано, есть ли способ гарантировать, что оригинал module._dict всегда импортируется?


Пример (также работоспособен код , без pytest).

# configs.py
_dict = {'a': 1, 'b': 2}
# non_test.py
from configs import _dict

class SomeClass():
   def __init__(self, a=None, b=None):
        self.a = a or _dict['a']
        self.b = b or _dict['b']
        del _dict['a']
# test_a.py
def test_class():
    SomeClass()
# test_b.py
def test_class():
    SomeClass()

Каждый test*.py имеет следующий заголовок и нижний колонтитул:

import pytest
from non_test import SomeClass
# test_*()
if __name__ == '__main__':
    pytest.main([__file__, "-s"])

Примечание : пример не отражает фактического контекста, в котором у меня гораздо меньше гибкости. Я не прошу решения самой проблемы - то, что я спрашиваю, прямо в названии вопроса. Если это «невозможно» или нет ничего близкого к этому, то это ответ.

1 Ответ

1 голос
/ 07 апреля 2020

Вы можете использовать функцию importlib.reload для перезагрузки модуля. Так как _dict из configs импортируется в модуль non_test, который затем импортируется в test_b, вам необходимо перезагрузить оба non_test и configs, чтобы иметь возможность повторно создать новый configs._dict и повторно импортировать его в non_test:

# test_b.py
import non_test
import configs
import importlib
importlib.reload(non_test)
importlib.reload(configs)

def test_class():
    SomeClass()

Демонстрация: https://repl.it/@blhsing / SaneDesertedMode

...