当前位置:  开发笔记 > 编程语言 > 正文

关于PyCharm中可变默认参数的警告

如何解决《关于PyCharm中可变默认参数的警告》经验,为你挑选了2个好方法。

我正在使用PyCharm(Python 3)编写一个Python函数,它接受一个字典作为参数attachment={}.

def put_object(self, parent_object, connection_name, **data):
    ...

def put_wall_post(self, message, attachment={}, profile_id="me"):
    return self.put_object(profile_id, "feed", message=message, **attachment)

在IDE中,attachment={}为黄色.将鼠标移到它上面会显示警告.

默认参数值是可变的

此检查检测何时在参数的默认值中检测到可变值作为列表或字典.

默认参数值仅在函数定义时计算一次,这意味着修改参数的默认值将影响函数的所有后续调用.

这意味着什么,我该如何解决?



1> MSeifert..:

如果您不改变"可变默认参数"或将其传递到可以更改的任何地方,则忽略该消息,因为没有任何内容可以"修复".

在您的情况下,您只需解压缩(隐式副本)"可变默认参数" - 所以您是安全的.

如果您要"删除该警告消息",您可以将其None用作默认设置并将其设置为以下{}时间None:

def put_wall_post(self,message,attachment=None,profile_id="me"):
    if attachment is None:
        attachment = {}

    return self.put_object(profile_id,"feed",message = message,**attachment)

只是为了解释"是什么意思":某些类型在Python是不可改变的(int,str,...)等是可变的(如dict,set,list,...).如果要更改不可变对象,则会创建另一个对象 - 但如果更改了可变对象,则该对象保持不变,但其内容会发生更改.

棘手的部分是在加载函数时(并且只加载一次)创建类变量和默认参数,这意味着对"可变默认参数"或"可变类变量"的任何更改都是永久性的:

def func(key, value, a={}):
    a[key] = value
    return a

>>> print(func('a', 10))  # that's expected
{'a': 10}
>>> print(func('b', 20))  # that could be unexpected
{'b': 20, 'a': 10}

PyCharm可能会显示此警告,因为很容易意外地弄错(例如,参见"最小惊讶"和Mutable默认参数以及所有相关问题).但是,如果你是故意这样做的(好的用于可变函数参数默认值?)警告可能很烦人.



2> Peter Wood..:

您可以将可变的默认参数替换为None。然后在函数内部检查并分配默认值:

def put_wall_post(self, message, attachment=None, profile_id="me"):
    attachment = attachment if attachment else {}

    return self.put_object(profile_id, "feed", message=message, **attachment)

这行得通,因为None计算结果为,False因此我们分配了一个空字典。

一般来说,你可能要显式检查None的其他值也可以评估到False,例如0''set()[],等,都是False-y。如果您的默认值不是05例如),那么您将不希望0被作为有效参数传递:

def function(param=None):
    param = 5 if param is None else param


甚至更短的`attachment =附件或{}`
推荐阅读
mobiledu2402851373
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有