1

我试图方便地将一组参数传递给许多函数(比如 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总是只有相关字段是传递参数的好方法吗?

4

3 回答 3

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}
于 2012-11-09T17:45:06.523 回答
2

Namedtuple直接为您执行此操作。

这是来自 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
于 2012-11-09T17:31:32.083 回答
0
for attribute, attribute_value in obj.__dict__.items():  # or obj.__dict__.iteritems() 
    print attribute, attribute_value
于 2014-03-24T03:54:46.740 回答