在Python中,如何在不更改名称空间的情况下在另一个文件(宏样式)中包含(不导入)一个文件?

时间:2011-06-14 18:21:30

标签: python macros include

首先我知道'进口'。当我尝试'导入'时,它不起作用。我要做的是将一个模块分成两部分,其中一部分可以由一个组编辑,另一部分则不可编辑。我希望该组能够编写定义良好的“检索函数”,而无需编辑运行它们的后端代码的诱惑或能力(甚至是偶然的)。 “导入”中名称空间的更改正在阻碍我。我正在寻找在File_B中包含File_A文本的宏样式,以便内联运行,就像它是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 / except子句,验证步骤以确保正确填充数据并且不包含不正确的类型或不良内容,以及代码通知团队是否以及在哪里发生了中断但仍然处理剩下的项目。目标是进行编辑的人不会破坏其余的检查,即使他们的编辑打破了其中一项检查。)

1 个答案:

答案 0 :(得分:5)

这可以使用execfile()完成,但您应该考虑使用其他一些机制,例如多态或插件。