如何避免解释器检查函数默认参数?

时间:2017-01-23 18:34:02

标签: python python-3.x error-handling python-import interpreter

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

导入时,应导入一个名为' globalSettings.py'的文件。包含import_location = /Users/Documents/etc之类的行将与它位于同一文件夹中。当它以__main__运行时,它不会需要它。

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

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

哪个好。

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

这是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文件。

无论如何都要忽略我得到的错误?

1 个答案:

答案 0 :(得分:1)

有条件地定义一个名称(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的默认值。