我有一个程序,既可以作为模块运行,也可以作为独立文件运行,而无需运行其他程序。

导入后,它应该导入一个名为“globalSettings.py”的文件,其中包含诸如import_location = /Users/Documents/etc这样的行,这些行将与该文件位于同一文件夹中。当它作为__main__运行时,将不需要它。

因此,在我的代码开头,我有以下内容:

try:
    import globalSettings
except ImportError:
    print("Being run as independent program")

没关系

调用主函数时,如果独立运行,则将相关设置直接传递给它,并且具有作为外部模块运行时将使用的默认值。

这是MCVE:
def test_func(foo, bar=globalSettings.import_location):
    do stuff

我这样称呼它:
if __name__ == "__main__":
    test_func(20, "Users/myname/testfolder/etc")

当我从其他地方导入它时,例如test_func(30),它将从globalSettings中找到bar。但是,当我独立运行它时,会引发错误:
Traceback (most recent call last):

 File "/Users/tomburrows/Dropbox/Python Programming/import_test.py", line 1, in <module>
  def test_func(foo, bar=globalSettings.import_location):
NameError: name 'globalSettings' is not defined

它永远不需要globalSettings,因为当我将其作为独立程序调用时,我总是将bar作为参数传递,仅当将其作为导入运行时,才需要它,当我确保它确实具有globalSettings文件时在它旁边。

反正有忽略我得到的错误吗?

最佳答案

有条件地定义名称(globalSettings),然后在脚本(特别是函数定义)中无条件地使用该名称,注定会失败。

您可以做的是确保即使发生异常,默认参数也始终存在:

try:
    import globalSettings
    import_location = globalSettings.import_location
except ImportError:
    print("Being run as independent program")
    import_location = ''  # or whatever else

然后将您的函数定义为import_location作为bar的默认值。

09-25 15:13