Как Python импортировать определенную переменную из файла без получения неопределенного имени ошибки для других переменных - PullRequest
0 голосов
/ 07 июня 2019

Я пытаюсь импортировать определенную переменную из файла1 в файл2. Я импортирую нужную переменную, но затем получаю ошибку, потому что она не распознает другие объекты в file1. Эти объекты определены в другом месте, но мне нет дела до них в file2.

Я попытался удалить другие объекты из файла 2 в качестве теста, и он работает нормально. Но я не могу просто удалить этот контент, так как он нужен другим файлам.

В file1.py:

 var1 = 5

 object1.member1 = 4    # "object1" class instantiation created elsewhere

В file2.py:

 from file1 import var1

 var2 = var1 + 6

Ошибка:

 File “file1.py”, line 2, in <module> object1.member1 = 4

 NameError: name ‘object1’ is not defined

Я бы ожидал, что "из fileX import varX" будет импортировать только значение varX и не беспокоиться об остальной части fileX.

Идеальный результат: var2 = 11.

Ответы [ 3 ]

2 голосов
/ 07 июня 2019

Я вижу несколько возможностей.

  1. Рефакторинг file1.py, поэтому он работает правильно при импорте любым другим модулем.Этот файл плохо спроектирован, как сейчас, поэтому погасите техническую задолженность и запрограммируйте его правильно.
  2. Скопируйте file1.py в другой модуль, скажем, file1_copy.py, они модифицируют его, чтобы удалить проблемный код.Импорт из измененной копии, а не из оригинала.
  3. Не импортировать из file1.py.Вместо этого рассматривайте это как текстовый файл.Откройте его как текстовый файл и выполните цикл по строкам.Когда вы найдете строку, которая начинается с возможных пробелов, тогда текст var1 (оканчивающийся пробелом) или var1= затем анализирует оставшуюся часть строки, чтобы получить желаемое значение var1.Это зависит от того, что строка var = 5 не «скрыта», но начинается с строки.
  4. Опять же, используйте file1.py в качестве текстового файла, но на этот раз используйте регулярные выражения для поиска var1 =.Это может потерпеть неудачу, но с большей вероятностью, чем предыдущий вариант.Конечно, для этого нужно понимать регулярные выражения.
0 голосов
/ 07 июня 2019

Вы не можете сделать это чисто. Проблема в том, что ваш file1 модуль не модульный: он не содержит атомарный инкапсулированный набор функций. Если ваши варианты использования включают требование для использования var1 без object1, то вы нарушили модульные предположения, сделанные при создании file1.

Вам нужно разделить file1, чтобы обслуживать вашу модель использования.

0 голосов
/ 07 июня 2019

В вашем файле1 - по крайней мере, в этом сокращенном примере - отсутствует import для файла 0, который определяет object1.

...