python - instance'__dict__ 的关键字参数拆包有哪些陷阱?

标签 python arguments argument-unpacking

我正在尝试方便地将一些参数集传递给多个函数(比如 20 个)。

考虑以下 MWE(当然我真的不考虑以这种方式进行添加):

def function(a, b):
    return a + b


class summation:
    def __init__(self, a, b):
        self.a = a
        self.b = b


s = summation(1,2)

function(**s.__dict__)

我尝试这样做的原因是我有一堆函数都接收 4 个相同的参数,我需要在管道中处理它们,从一个函数传递到另一个函数。

暗示 s 总是只有相关字段是传递参数的好方法吗?

最佳答案

通常使用 obj.__dict__ 是个坏主意,因为对象字典不包含对象上可能存在的任何描述符或其他“魔法”属性。它还将包括隐藏属性,按照惯例,这些属性隐藏在 _ 前缀后面。因此,obj.__dict__ 技术实际上只适用于完全基本的类型,如果您决定将任何属性更新为属性以便您可以控制它们的 getter/setter 等,则它不是 future 的证明。vars(obj) 有同样的问题。

class Rectangle(object):
    x = 0
    y = 0
    _width = 0
    height = 0

    @property
    def width(self):
        return self._width

    @width.setter
    def width(self, value):
        if value < 0:
            value = -value
            self.x -= value
        self._width = value

>>> r = Rectangle()
>>> r.__dict__
{}
>>> # this is because everything is class-level properties so far
>>> r.width = 50
>>> r.__dict__
{'_width': 50}

关于python - instance'__dict__ 的关键字参数拆包有哪些陷阱?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13312977/

相关文章:

python - 如何防止 werkzeug 记录日志

javascript - selenium driver.execute_script 中的 Python var

bash - 无法评估函数的脚本参数

r - 从函数外部向函数传递多少个参数

python - **(双星/星号)和*(星/星号)对参数有何作用?

python - 如何配置python+uwsgi+nginx?

python - super 集仪表板 - 动态更新

c++ - 为什么我们不能通过值传递数组来函数?

python - 如何从列表中提取参数并将它们传递给函数调用

解包许多返回值时的行长度和格式的 Python 样式