Единственный способ решить эту проблему - захватить внутреннюю импортную технику самостоятельно.Это не просто, а чревато опасностью.Вы должны избегать маяка в форме грааля любой ценой, потому что опасность слишком опасна.
Вместо этого переименуйте ваш модуль.
Если вы хотите научиться угонять внутреннюю импортную технику, вот гдевам нужно узнать, как это сделать:
Иногда есть веские причины, чтобы попасть в эту опасность.Причина, которую вы приводите, не среди них.Переименуйте ваш модуль.
Если вы выберете опасный путь, одна из проблем, с которой вы столкнетесь, заключается в том, что при загрузке модуля он заканчивается «официальным именем», так что Python может избежать необходимости разбирать содержимоеэтот модуль когда-либо снова.Сопоставление «официального имени» модуля с самим объектом модуля можно найти в sys.modules
.
. Это означает, что если вы import calendar
в одном месте, любой импортируемый модуль будет рассматриваться какпоскольку модуль с официальным именем calendar
и всеми другими попытками import calendar
где-либо еще, в том числе в другом коде, который является частью основной библиотеки Python, получит этот календарь.
Возможно, будет возможно спроектироватьклиентский импортер, использующий модуль imputil в Python 2.x, который заставлял модули, загруженные по определенным путям, сначала искать модули, которые они импортировали, чем-то отличным от sys.modules
или чем-то в этом роде.Но это очень сложная вещь, и в Python 3.x она не будет работать в любом случае.
Есть очень уродливая и ужасная вещь, которую вы можете сделать, которая не связана с перехватом механизма импорта.Это то, что вы, вероятно, не должны делать, но это, вероятно, будет работать.Он превращает ваш calendar
модуль в гибрид модуля системного календаря и модуля календаря.Спасибо Боазу Яниву за скелет функции, которую я использую .Поместите это в начало вашего 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__])