Как переопределить импорт Python?

Этот следующий синтаксис работает для меня.

UPDATE
(SELECT A.utl_id,
    b.utl1_id
    FROM trb_pi_joint A
    JOIN trb_tpr B
    ON A.tp_id=B.tp_id Where A.pij_type=2 and a.utl_id is null
)
SET utl_id=utl1_id;
30
задан Community 23 May 2017 в 12:34
поделиться

4 ответа

Это ответ на ваш вопрос? Второй импорт делает трюк.

Mod_1.py

def test_function():
    print "Test Function -- Mod 1"

Mod_2.py

def test_function():
    print "Test Function -- Mod 2"

Test. py

#!/usr/bin/python

import sys

import Mod_1

Mod_1.test_function()

del sys.modules['Mod_1']

sys.modules['Mod_1'] = __import__('Mod_2')

import Mod_1

Mod_1.test_function()
35
ответ дан 27 November 2019 в 20:58
поделиться

Очень странный подход - эмулировать язык низкого уровня языком высокого уровня. Если первый простой способ не работает, может быть, это неправильная цель?

BTW, препроцессор C просто работает с текстовыми файлами и набором переменных препроцессора, а не с высокоуровневыми загружаемыми/выгружаемыми модулями.

0
ответ дан 11 October 2019 в 02:06
поделиться

Чтобы определить другое поведение импорта или полностью подорвать процесс импорта, вам нужно будет написать перехватчики импорта. См. PEP 302 .

Например,

import sys

class MyImporter(object):

    def find_module(self, module_name, package_path):
        # Return a loader
        return self

    def load_module(self, module_name):
        # Return a module
        return self

sys.meta_path.append(MyImporter())

import now_you_can_import_any_name
print now_you_can_import_any_name

Он выводит:

<__main__.MyImporter object at 0x009F85F0>

По сути, он возвращает новый модуль (который может быть любым объектом), в данном случае сам. Вы можете использовать его для изменения поведения импорта, возвращая processse_xxx при импорте xxx .

IMO: Python не требует препроцессора. Все, что вы делаете, может быть выполнено в самом Python из-за его очень динамичной природы, например, в случае примера отладки, что плохого в том, чтобы иметь верхнюю часть файла

debug = 1

и позже

if debug:
   print "wow"

?

12
ответ дан 27 November 2019 в 20:58
поделиться

В Python 2 есть модуль imputil , который, кажется, обеспечивает нужную вам функциональность, но был удален в python 3. Он не очень хорошо документирован, но содержит пример раздела, в котором показано, как можно заменить стандартные функции импорта.

Для Python 3 существует модуль importlib (представленный в Python 3.1), который содержит функции и классы для изменения функциональности импорта всеми видами способов. Должно быть удобно подключить препроцессор к системе импорта.

0
ответ дан 27 November 2019 в 20:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: