作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个像这样的函数包装器
def fun(arg, kwarg=None): # in my code the function is imported from a package
return None
def mywrap(myarg, funkwargs={"kwarg": "default"}):
return fun(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:
"""MyWrap.
Parameters
----------
myarg : Any
funkwargs : Dict[Any, Any], Optional
Default `{"kwarg": "default"}`.
"""
if not funkwargs:
funkwargs = {"kwarg": "default"}
return fun(myarg, **funkwargs)
最佳答案
“正确”答案是 types.MappingProxyType
.这会在原始词典上创建一个只读 View 。
def mywrap(myarg, funkwargs=types.MappingProxyType({"kwarg": "default"})):
return fun(myarg, **funkwargs)
比使用 None
作为默认值要好得多。
关于python-3.x - 在包装器中避免 flake8-bugbear 的 B006(即可变默认警告)的预期方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59425124/
COW 不是奶牛,是 Copy-On-Write 的缩写,这是一种是复制但也不完全是复制的技术。 一般来说复制就是创建出完全相同的两份,两份是独立的: 但是,有的时候复制这件事没多大必要
我是一名优秀的程序员,十分优秀!