В Python, как я могу включить (не импортировать) один файл в другой файл, стиль макроса, без изменения пространства имен? - PullRequest
2 голосов
/ 14 июня 2011

Сначала я знаю про «импорт».Когда я пытаюсь «импортировать», это не работает.То, что я пытаюсь сделать, это разделить один модуль на две части, одна из которых редактируется группой, а другая - нет.Я хочу, чтобы группа написала четко определенные «функции поиска» без искушения или возможности редактировать код бэкэнда, который их запускает (даже случайно).Изменения в пространстве имен при импорте мешают мне.Я ищу включение макроса в тексте File_A внутри File_B, которое должно быть встроено, как если бы оно было частью File_B.

Вот что я делаю:

У меня естьнекоторый обобщенный код, предназначенный для вызова списка функций поиска информации по очереди и унифицированного хранения информации.Для этого я добавляю его текстовое имя в список:

DataTypes = ['TypeA','TypeB','TypeC']

..., а затем определяю функцию, которая знает, как получить каждый тип, и возвращает класс заполненного объекта:

def Get_TypeA:
    # do some stuff to retrieve info
    InfoObj Data
    # Populate Data with the info I got
    return Data

def Get_TypeB:
    # etc. etc.
    return Data
def Get_TypeC:
    # etc. etc.
    return Data

# Backend code below this line, hopefully nobody touches it?
# (But really it would be best if this was in a different file
#  that is harder to mess with and has locked-down permissions.)
class InfoObj:
    # stuff stuff definitions methods etc.

Эти функции будут редактироваться людьми, обладающими только базовыми знаниями Python, но часто имеющими плохие привычки кодирования, но которые должны иметь возможность часто настраивать то, что собирается и отображается.У меня уже есть бэкэнд, который проверяет список и вызывает функции, но я просто хочу переместить эти определения в отдельный файл из остального кода бэкэнда, но работать так, как если бы они были прямо в строке.(т. е. превратить «надеюсь, никто не тронет его» в «люди должны изо всех сил прикасаться к нему»)

Есть ли у Python это?

Когда я пытаюсь использовать Import,поисковые функции теряют связь с определением InfoObj.Это происходит независимо от того, использую ли я «import otherFile» или «from otherFile import *».

РЕДАКТИРОВАТЬ: это то, что я использую для извлечения различных типов стандартным способом:

THISMODULE = sys.modules[__name__]

for type in DataTypes:
    RetrievalFn = getattr( THISMODULE, 'Get_'+type )
    Data = RetrievalFn()
    StoreInDB(Data)

(хотя это сводится к основам, есть предложения try / Кроме того, шаги проверки, чтобы убедиться, что Данные были заполнены правильно и не содержит неправильных типов или плохих вещей, и код для уведомления команды, если и где что-то ломается, но все жеобработайте остальные элементы. Цель состоит в том, чтобы кто-то, вносящий изменения, не нарушал остальные проверки, даже если их изменения нарушали одну из проверок.)

1 Ответ

5 голосов
/ 14 июня 2011

Это можно сделать с помощью execfile(), но вам следует рассмотреть возможность использования для этого другого механизма, например, полиморфизма или плагинов.

...