Как загрузить 2 функции с одинаковым именем из 2 python файлов с одинаковым именем? - PullRequest
1 голос
/ 05 февраля 2020

У меня проблема с импортом. Я пытаюсь импортировать 2 функции с одинаковыми именами из модулей с одинаковыми именами. Обратите внимание, что я делаю это в Pycharm.

У меня есть следующая структура каталогов:

test_import 
|--foo.py  
|--main.py  
|--test
   |--foo.py  

Код

foo.py в папке test_import выглядит следующим образом:

def print_arg(x):
    print('print 1: {}'.format(x))

foo.py в папке test выглядит следующим образом:

def print_arg(x):
    print('print 2: {}'.format(x))

Вот мой код в main.py, в котором я нахожусь делать импорт print_arg:

import sys
from foo import print_arg as print_arg
print_arg(1)
sys.path.insert(1, './test')
from foo import print_arg as print_arg_2
print_arg(1)
print_arg_2(1)

Я ожидаю, что это напечатает

print 1: 1
print 1: 1
print 2: 1

Но он печатает

print 1: 1
print 1: 1
print 1: 1

Почему-то второй импорт не работает и print_arg_2 становится ссылкой на print_arg. Это иллюстрируется выполнением импорта наоборот:

sys.path.insert(1, './test')
from foo import print_arg as print_arg_2
print_arg_2(1)
sys.path.pop(1)
from foo import print_arg
print_arg(1)
print_arg(1)
print_arg_2(1)

, который печатает:

print 2: 1
print 2: 1
print 2: 1

Изменение имени функции в test / foo.py на print_arg_2 не работает , это приводит к ошибке. Кажется, что ссылка на foo.py в папке проекта была создана, и она пытается импортировать ее оттуда вместо поиска в других каталогах на sys.path

Traceback (most recent call last):
  File "C:\Users\jeroe\AppData\Local\Programs\Python\Python37\lib\site-packages\IPython\core\interactiveshell.py", line 3326, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-2-10fe80aec78f>", line 5, in <module>
    from foo import print_arg_2 as print_arg_2
ImportError: cannot import name 'print_arg_2' from 'foo' (C:\Users\jeroe\PycharmProjects\test_import\foo.py)

Изменение имени файла foo.py в папка test, например, foo2.py работает. Однако я предпочитаю не менять имя файла.

Поэтому у меня есть 2 вопроса:

  1. Может кто-нибудь объяснить мне, что здесь происходит?

  2. Как лучше импортировать эти 2 функции без изменения имени файла (модуля)?

1 Ответ

1 голос
/ 05 февраля 2020

Прежде всего, вам нужно добавить пустой файл __init__.py в тестовую папку, чтобы можно было импортировать второй файл foo.

Во-вторых, вы должны записать полный относительный путь ко второму. файл при импорте. Прямо сейчас вы оба раза импортируете первый файл foo.

Просто измените вторую строку импорта на:

from test.foo import print_arg as print_arg_2
...