нырнул в кроличью нору, но здесь мы идем.В качестве отказа от ответственности, как сказал Джек, именование модулей после встроенных команд является очень плохой практикой, и это легче сделать, используя imp, как он предложил.
Причина, по которой у вас проблемы, связана с взаимодействием нескольких вещей.Когда вы набираете
import math
, то, что делает ваш питон, это смотрит на sys.path.Он проверит все местоположения в sys.path для модуля с именем math и импортирует первый найденный модуль.В вашем случае он сначала находит ваш локальный математический модуль.После завершения импорта он добавляет его в sys.modules, но мы вернемся к этому.
Поскольку вы хотите использовать оба, сначала вы можете импортировать свою локальную математику, как у вас есть.Я бы предложил импортировать его под другим именем, чтобы оно было отдельным.
from . import math as local_math
После этого нам нужно связываться с нашим sys.path, чтобы найти встроенную математику
sys.path = sys.path[::-1]
Это меняет порядок sys.path, то есть он будет выглядеть в вашемсначала локальный каталог, а не последний.
Теперь вы можете подумать, что этого достаточно, но если вы попытаетесь импортировать математику здесь, python увидит ее в sys.modules и не будет пытаться импортировать снова, поэтому сначала
del sys.modules['math']
Затем мы можем импортировать математический модуль по умолчанию
import math
и, наконец, очистить наш sys.path
sys.path = sys.path[::-1]
, теперь у нас есть доступ ко всему, что нам нужно
>>>math.cos(10)
-0.8390715290764524
>>>local_math.f(10)
1000