导入模块时为什么获得一些python函数,而其他却没有?

时间:2020-09-29 00:29:49

标签: python-2.7 python-module nameerror

我正在用Python 2.7.8编写函数库,以便在使用froglogic Squish进行的一些UAT测试中使用。这是给我老板的,所以我不确定我可以分享多少并仍然遵守公司隐私法规。

在开发的早期,我将一些功能放在了一些很小的文件中。有一个文件仅包含一个功能。我可以导入文件,并且可以正常使用该功能。

我正要把一些小文件合并成一个大文件。由于某些原因使我完全无法理解,例如,找不到我复制/粘贴到此较大文件中的某些功能,并显示“ NameError:全局名称'My_variableStringVerify'未定义”错误。 (我只是添加了“ My_”,以防与其他功能发生名称冲突...)

这与EXACT相同的简单功能在单独的“模块”中一起工作。可以找到并使用此python文件中的其他功能-在新的扩展模块中此功能之前和之后出现-并没有问题。此功能唯一需要的模块是re。我正在导入。我删除了目录中的所有pyc文件,以防未更新(我很确定是从pyc文件的日期时间开始)。

我已经在十二个“库模块”中创建并使用了十个功能,而所有这些都没有问题。这个琐碎的废话功能作为不同模块的一部分有何特别之处?它以前可以工作,但仍然可以工作-只要我不尝试从新的库模块中使用它即可。

我不是python专家,但多年来我一直在做这种事情...

1 个答案:

答案 0 :(得分:0)

U。真是个蠢才。答案毕竟是错误:“找不到 global 名称xxx”。我试图直接在Squish API调用内使用该函数,这是全局作用域。将调用移至Squish API调用之外的函数中(在本地范围内使用),效果很好。

令我惊讶的细节:在两种情况下(在将其添加到我的另一个“库”模块之前和之后),我都使用“ from foo import *”。

当这个函数是foo中的唯一函数时,我能够在全局范围内成功使用它。

当它只是foo扩展中的众多功能之一(名称已更改,以保护无辜者)时,我无法在全局范围内使用它。我不得不在本地范围内引用它。

花了更多时间阅读https://docs.python.org/2.0/ref/import.html(是的,它很旧了),我惊讶的是,无论哪种情况,它都出现在全局范围内。该页面确实指出:“(当前的实现不会强制执行后两个限制,但是程序不应滥用这种自由,因为将来的实现可能会强制执行它们或默默更改程序的含义。)”关于范围限制,并带有“从foo import *“语句。

我想我发现了一个边缘案例,以某种方式规避了此实现中的限制。

还是……真是一个栗色!验证我不是Python专家的说法。