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__手法は実際には完全に基本的なタイプに対してのみ機能し、属性をプロパティに更新してゲッター/セッターなどを制御できるようにした場合、将来的には保証されません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はあなたのためにこれを完全に行います。

これがPyConUS2011からの講演です [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 に答える