python - 为什么 PyCharm 会警告可变的默认参数?我该如何解决它们?

标签 python pycharm warnings

我正在使用 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={} 为黄色。将鼠标移到它上面会显示一个警告。

Default arguments value is mutable

This inspection detects when a mutable value as list or dictionary is detected in a default value for an argument.

Default argument values are evaluated only once at function definition time, which means that modifying the default value of the argument will affect all subsequent calls of the function.

这是什么意思,我该如何解决?

最佳答案

如果您不更改“可变默认参数”或将其传递到可以更改的任何地方,请忽略该消息,因为没有什么需要“修复”。

在您的情况下,您解压缩(执行隐式复制)“可变默认参数” - 所以您是安全的。

如果您想“删除该警告消息”,您可以使用 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 中的某些类型是不可变的(intstr、...)其他类型是可变的(例如 dict, set, list, ...)。如果您想更改不可变对象(immutable对象),则会创建另一个对象 - 但如果您更改可变对象,则该对象保持不变,但其内容已更改。

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

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 可能会显示此警告,因为它很容易意外出错(参见示例 Why do mutable default arguments remember mutations between function calls? 和所有链接的问题)。但是,如果您是故意这样做的 (Good uses for mutable function argument default values?),警告可能会很烦人。

关于python - 为什么 PyCharm 会警告可变的默认参数?我该如何解决它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41686829/

相关文章:

python - 如何将我的 Python C 模块放入包中?

python - 使用 matplotlib 对 Latex 进行像素渲染

python-3.x - Pycharm 将打印中的 kwargs 识别为错误(python3)

python - Pycharm 警告 : Expected 'collection.iterable' , 改为迭代器

xcode - Apple Mach-O 链接器警告不会消失

python - 使用某些条件替换 numpy 数组中的元素

python - 将一个文件中的所有对象添加到另一个文件中的列表

selenium - 如何使用 Selenium::Remote::Driver 抑制 "warning"?

intellij-idea - 开始编写 IntelliJ 插件

C++:警告: '...' 声明的可见性高于其字段 '...::<anonymous>' 的类型