Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 你打算用什么方法来避免Flake 8 bugbear';s B006,即包装中的可变默认警告?_Python 3.x_Flake8 - Fatal编程技术网

Python 3.x 你打算用什么方法来避免Flake 8 bugbear';s B006,即包装中的可变默认警告?

Python 3.x 你打算用什么方法来避免Flake 8 bugbear';s B006,即包装中的可变默认警告?,python-3.x,flake8,Python 3.x,Flake8,我有一个这样的函数包装器 def-fun(arg,kwarg=None):#在我的代码中,函数是从包导入的 一无所获 def mywrap(myarg,funkwargs={“kwarg”:“default”}): 返回乐趣(myarg,**funkwargs) 如果我运行包括Bugbear在内的flake8,我会收到B006警告: $ flake8 above_example.py above_example.py:5:29: B006 Do not use mutable data st

我有一个这样的函数包装器

def-fun(arg,kwarg=None):#在我的代码中,函数是从包导入的
一无所获
def mywrap(myarg,funkwargs={“kwarg”:“default”}):
返回乐趣(myarg,**funkwargs)
如果我运行包括Bugbear在内的flake8,我会收到B006警告:

$ flake8 above_example.py 
above_example.py:5:29: B006 Do not use mutable data structures for argument defaults.  They are created during function definition time. All calls to the function reuse this one instance of that data structure, persisting changes between them.
在上面的例子中,如果我想为
fun
提供一些默认设置,那么打算用什么方法来实现呢

版本:

$ flake8 --version
3.7.9 (flake8-bugbear: 19.8.0, mccabe: 0.6.1, pycodestyle: 2.5.0, pyflakes: 2.1.1) CPython 3.7.3 on Linux
编辑: 如果答案是“使用
None
”,以下是“正确”的方法吗

def mywrap(myarg:Any,funkwargs:Optional[Dict[Any,Any]]]=None)->None:
“我的包裹。
参数
----------
迈尔格:有吗
funkwargs:Dict[Any,Any],可选
默认值`{“kwarg”:“默认值”}`。
"""
如果不是funkwargs:
funkwargs={“kwarg”:“default”}
返回乐趣(myarg,**funkwargs)
正确的答案是。这将在原始词典上创建只读视图

def mywrap(myarg,funkwargs=types.MappingProxyType({“kwarg”:“default”})):
返回乐趣(myarg,**funkwargs)

比使用
None
作为默认值要好得多。

使用
None
作为默认值,而不是编辑:是的,但如果funknwargs为None,我会编写
:…
来区分故意传递的
funkwargs={}
在未修改输入时,不要使用
None
作为默认值:这会使代码更加不清晰。改为使用不可变映射(请参见我的答案)或使消息静音(
#noqa:B006
)。这将生成一个
B008
。。。所以答案是不好的。@EmmanuelSciara,不是在我的机器上。我使用的是Flake8V3.9.0和Flake8BugbearV21.4.3。事实上,对此有一个明确的单元测试:事实上,这个功能是在6个月前添加的,而我的版本早于此。我的错。大多数文献仍然指出
可选[Dict[Any,Any]]=None
解决方案,然后检查代码,但这种方式似乎更好。我想知道它适用于Python 3的哪个版本,虽然.types.MappingProxyType是在Python 3.3中添加的,所以它适用于所有非EOL版本。