关键字参数解包实例'__dict__的缺陷是什么?

时间:2012-11-09 17:28:30

标签: 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始终只有相关字段,这是传递参数的好方法吗?

3 个答案:

答案 0 :(得分:3)

一般来说使用obj.__dict__是一个坏主意,因为对象字典不包含任何描述符或对象上可能存在的其他“魔术”属性。它还将包含隐藏的属性,按照惯例,隐藏在_前缀后面。因此,obj.__dict__技术实际上仅适用于完全基本类型,如果您决定将任何属性更新为属性,以便您可以控制其getter / setter等,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}

答案 1 :(得分:2)

Namedtuple直接为你做这件事。

这是talk from PyCon US 2011 [11:35 - 26:00]

from collections import namedtuple
Add = namedtuple("Add", "a b c d")

one = Add(1, 2, 3, 4)

def addme(a, b, c, d):
    print a + b
    print c + d

>>> addme(*one)
... 3
... 7

答案 2 :(得分:0)

for attribute, attribute_value in obj.__dict__.items():  # or obj.__dict__.iteritems() 
    print attribute, attribute_value