我有一个程序,既可以作为模块运行,也可以作为独立文件运行,而无需运行其他程序。
导入后,它应该导入一个名为“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
的默认值。