在Python中如何像宏一样在一个文件中包含另一个文件,而不改变命名空间?

2 投票
1 回答
3222 浏览
提问于 2025-04-16 19:33

首先,我知道什么是'import'。但是当我尝试使用'import'时,它并没有按我想的那样工作。我想把一个模块分成两个部分,其中一个部分可以被一个小组编辑,而另一个部分则不能。我希望这个小组能够编写明确的“检索函数”,而不会有机会或诱惑去修改运行这些函数的后端代码(即使是无意中)。'import'时的命名空间变化让我感到困扰。我希望能像宏一样把File_A的内容包含到File_B中,让它在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/except语句、验证步骤以确保数据被正确填充且不包含错误类型或坏东西,以及代码来通知团队如果哪里出错,但仍然处理其余的项目。目标是让进行编辑的人不会破坏其他检查,即使他们的编辑破坏了其中一个检查。)

1 个回答

6

这可以通过 execfile() 来实现,但你应该考虑使用其他方法,比如多态或者插件,这样可能会更好。

撰写回答