Python函数';s参数的默认值是从另一个模块导入的 我们考虑下面的例子: import module def function(param=module.value): pass

Python函数';s参数的默认值是从另一个模块导入的 我们考虑下面的例子: import module def function(param=module.value): pass,python,function,default-value,anti-patterns,Python,Function,Default Value,Anti Patterns,将函数参数的默认值设置为从另一个模块导入的标识符是否是一种良好的做法?我知道它是有效的,但我想问的是干净的代码方法和可能的问题。我可以在这里看到一个潜在的漏洞:从模块导入的变量值在下一版本中可能是可变的。您对此有何看法?我建议将默认值设置为None,然后在代码中进行编程测试: import module def function(param = None): if param is None: param = module.value 这可能是因为直接赋值(只复制引用

将函数参数的默认值设置为从另一个模块导入的标识符是否是一种良好的做法?我知道它是有效的,但我想问的是干净的代码方法和可能的问题。我可以在这里看到一个潜在的漏洞:从
模块导入的变量值在下一版本中可能是可变的。您对此有何看法?

我建议将默认值设置为
None
,然后在代码中进行编程测试:

import module

def function(param = None):
    if param is None:
        param = module.value
这可能是因为直接赋值(只复制引用)不合适

例如,您提到对象的类在发布之间可能会从不可变变为可变。如果发生这种情况,那么您可能需要使用而不是赋值

但是,并不是所有类都有自己的
\uuuu deepcopy\uuuu()
,因此复制对象可能会有问题。可能是应该使用原始对象的值创建新对象。如果不知道对象的类别以及如何使用
param

,很难说应该使用什么。如果库更改或弃用了值,您仍然可以获得相同的值

只需编写一个简单的包装器
moduleWrapper

def getValue():
    try:
        return module.value
    except:
        return None
或者,您可以设置所需的默认值,然后将此函数设置为param

import moduleWrapper
def function(param=moduleWrapper.getValue()):
    pass

这样,如果模块更改,您仍然可以让代码工作。

但是为什么首先要为
param
设置默认值呢?我认为以后调用它时将其作为参数传递会更清楚:
function(module.value)
。这是关于默认参数有用性的更多注释。默认参数非常有用,因为您不希望调用方必须指定它们(大多数情况下)。