setattr s kwargs, pythonic, nebo ne?

hlasů
15

Já používám __init__()jako je to v některých třídách SQLAlchemy ORM, které mají mnoho parametrů (až 20).

def __init__(self, **kwargs):
    for k, v in kwargs.iteritems():
        setattr(self, k, v)

Je to „pythonic“ nastavit atributy, jako je tento?

Položena 11/04/2009 v 07:31
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
1

Zdá se mi docela pythonic pokud budete potřebovat jen to na jednom místě v kódu.

Následující odkaz obsahuje více ‚generický‘ přístup ke stejnému problému (například s dekoratér a některé další funkce), podívejte se na: http://code.activestate.com/recipes/551763/

Odpovězeno 11/04/2009 v 07:49
zdroj uživatelem

hlasů
20

Ano. Dalším způsobem, jak toho dosáhnout, je.

def __init__(self, **kwargs):
    self.__dict__.update( kwargs )
Odpovězeno 11/04/2009 v 12:04
zdroj uživatelem

hlasů
5

Ano, v případě, že to není „hezčí“ způsob dodávání argumenty.

Například pomocí své ORM tříd jste zmínil, možná by bylo více Python'y aby ..

col = Varchar()
col.index = True
col.length = 255

..spíše než..

col = Varchar(index = True, length = 255)

V pořádku, že to není nejlepší příklad, protože **kwargsmetoda by být ve skutečnosti hezčí .. ale můj názor je, vždy byste měli vzít v úvahu alternativní metody vedoucí k dosažení něčeho, před použitím někdy-odradit věci, jako je **kwargs..

Další věc, kterou byste měli mít na paměti, může dojít ke ztrátě chování uživatel očekává, jako je například zvýšení TypeError případě, že uživatel dodává neplatný klíčových Arg, které by mohly být pracoval tam jako ..

def __init__(self, **kwargs):
    valid_kwargs = ['x', 'y', 'z']
    for k, v in kwargs.iteritems():
        if k not in valid_kwargs:
            raise TypeError("Invalid keyword argument %s" % k)
        setattr(self, k, v)

Poslední věc, aby zvážila:

class Hmm:
    def __init__(self, **kwargs):
        for k, v in kwargs.iteritems():
            setattr(self, k, v)
    def mymethod(self):
        print "mymethod should print this message.."

x = Hmm(mymethod = None)
x.mymethod() # raises TypeError: 'NoneType' object is not callable
Odpovězeno 13/04/2009 v 15:58
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more