【问题标题】:Python function's parameter default value is imported from another modulePython函数的参数默认值是从另一个模块导入的
【发布时间】:2019-04-09 22:28:31
【问题描述】:
让我们考虑以下示例:
import module
def function(param=module.value):
pass
将函数参数的默认值设置为从另一个模块导入的标识符是否是一种好习惯?我知道它有效,但我问的是干净的代码方法和可能的问题。我可以在这里看到一个潜在的漏洞:从module 导入的变量的值在下一个版本中可能是可变的。你怎么看?
标签:
python
function
default-value
anti-patterns
【解决方案1】:
我建议将默认值设置为None,然后在您的代码中以编程方式对其进行测试:
import module
def function(param = None):
if param is None:
param = module.value
可能是直接分配(仅复制引用)不合适。
例如,您提到对象的类可以在版本之间从不可变变为可变。如果发生这种情况,那么您可能需要使用 copy.deepcopy() 而不是分配。
但是,并非所有类都有自己的__deepcopy__(),因此复制对象可能会出现问题。可能应该使用原始值创建一个新对象。在不知道对象的类以及您将要使用param 做什么的情况下,很难说应该使用什么。
【解决方案2】:
您可以根据自己的目的写wrapper。如果库更改或弃用值,您仍然可以获得相同的值。
只需写一个简单的包装器moduleWrapper
def getValue():
try:
return module.value
except:
return None
或者你可以设置你想要的默认值,然后你可以将此函数设置为参数。
import moduleWrapper
def function(param=moduleWrapper.getValue()):
pass
这样,如果模块发生变化,您仍然可以让您的代码正常工作。