名称''未定义

时间:2018-06-21 15:51:01

标签: python python-3.x

我有一个内置在内置函数中的函数。这用于从项目基本目录加载具有相对路径的python模块。项目的基本目录存储在buildins.absolute

以下功能:

def projectRelativeImport(fileName, projectRelativePath, moduleName = None):
    # if moduleName not set, set it to file name with first letter capatilised
    if moduleName is None:
        moduleName = fileName[:1].capitalize() + fileName[1:]

    # we shouldn't be passing fileName with an extension unless moduleName is set due to previous if. So in those cases we add .py
    if len(fileName) >= 3 and fileName[-3:] != '.py':
        fileName = fileName + '.py'

    dir = os.path.join(builtins.absolute, projectRelativePath)
    full = os.path.join(dir, fileName)

    sys.path.append(dir)
    imp.load_source(moduleName, full)
    sys.path.remove(dir)

在其他文件之一中,我使用projectRelativeImport('inputSaveHandler', 'app/util', 'SaveHandler')从app / util / inputSaveHandler.py导入SaveHandler。这在整个项目RelativeImport中运行都很好。 imp已使用正确的字符串,我已打印进行检查。

但是在执行之后几行,我有一行

handler = SaveHandler.ConfHandler()

哪个抛出NameError: name 'SaveHandler' is not defined


我意识到我的项目相对导入功能有点奇怪,尤其是因为我使用内置函数将其全局保存(可能是一种更好的方法,但最近两天才开始使用python)。但是我对为什么不认识这个名字有点困惑。由于项目相对导入功能位于不同的文件中,我是否需要从imp返回一些内容,因为作用域是垃圾?

1 个答案:

答案 0 :(得分:0)

我通过从projectRelativeImport()返回从imp.load_source返回的内容来解决此问题,如下所示:

sys.path.append(dir)
submodule = imp.load_source(moduleName, full)
sys.path.remove(dir)
return submodule

然后,当我使用import函数时,返回的值现在转到一个变量,该变量的名称与我给模块使用的名称相同(都很奇怪)

SaveHandler = projectRelativeImport('inputSaveHandler', 'app/util', 'SaveHandler')

我之所以这样做,是因为在projectRelativeImport文件中定义的文件没有问题,但没有其他任何定义。因此,这显然对我来说是一个范围问题,所以我认为我会尝试退回给我带来的印象,