Единственный способ решить эту проблему - самостоятельно угнать внутреннюю импортную технику. Это непросто и чревато опасностями. Вы должны избегать маяка в форме Грааля любой ценой, потому что опасность слишком велика.
Вместо этого переименуйте свой модуль.
Если вы хотите узнать, как взломать механизм внутреннего импорта, вот где вы должны узнать, как это сделать:
Иногда есть веские причины попасть в такую опасность. Причины, по которой вы говорите, среди них нет. Переименуйте свой модуль.
Если вы выберете опасный путь, одна проблема, с которой вы столкнетесь, заключается в том, что когда вы загружаете модуль, он получает «официальное имя», так что Python может никогда больше не анализировать содержимое этого модуля. Сопоставление «официального имени» модуля с самим объектом модуля можно найти в sys.modules
.
Это означает, что если вы находитесь import calendar
в одном месте, любой импортированный модуль будет рассматриваться как модуль с официальным именем, calendar
и все другие попытки import calendar
куда-либо еще, в том числе в другом коде, который является частью основной библиотеки Python, получат этот календарь.
Можно было бы разработать клиентский импортер, используя модуль imputil в Python 2.x, который заставлял бы модули, загружаемые с определенных путей, искать модули, которые они импортируют, не в sys.modules
первом или чем-то подобном. Но делать это крайне непросто, и в любом случае это не сработает в Python 3.x.
Вы можете сделать очень уродливую и ужасную вещь, которая не требует подключения механизма импорта. Вероятно, вам не стоит этого делать, но, скорее всего, это сработает. Он превращает ваш calendar
модуль в гибрид модуля системного календаря и модуля календаря. Спасибо Boaz Yaniv за скелет функции, которую я использую . Поместите это в начало вашего calendar.py
файла:
import sys
def copy_in_standard_module_symbols(name, local_module):
import imp
for i in range(0, 100):
random_name = 'random_name_%d' % (i,)
if random_name not in sys.modules:
break
else:
random_name = None
if random_name is None:
raise RuntimeError("Couldn't manufacture an unused module name.")
f, pathname, desc = imp.find_module(name, sys.path[1:])
module = imp.load_module(random_name, f, pathname, desc)
f.close()
del sys.modules[random_name]
for key in module.__dict__:
if not hasattr(local_module, key):
setattr(local_module, key, getattr(module, key))
copy_in_standard_module_symbols('calendar', sys.modules[copy_in_standard_module_symbols.__module__])