setattr с kwargs, питон или нет? - PullRequest
       8

setattr с kwargs, питон или нет?

18 голосов
/ 11 апреля 2009

Я использую __init__() таким образом в некоторых классах SQLAlchemy ORM, которые имеют много параметров (до 20).

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

Является ли "pythonic" для установки атрибутов, как это?

Ответы [ 3 ]

24 голосов
/ 11 апреля 2009

Да. Еще один способ сделать это.

def __init__(self, **kwargs):
    self.__dict__.update( kwargs )
8 голосов
/ 13 апреля 2009

Да, если нет более «хорошего» способа предоставления аргументов.

Например, используя упомянутые вами классы ORM, возможно, было бы больше Python'y, чтобы разрешить ..

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

.. а не ..

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

Хорошо, это не лучший пример, так как метод **kwargs на самом деле был бы лучше ... но я хочу сказать, что вы должны всегда рассматривать альтернативные методы достижения чего-либо, прежде чем использовать иногда обескураженные вещи, такие как **kwargs ..

Еще одна вещь, о которой следует помнить, это то, что вы можете потерять поведение, которое ожидает пользователь, например, вызвать ошибку TypeError, если пользователь введет недопустимое ключевое слово arg, которое можно обойти, например ..

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)

Последнее, что нужно учитывать:

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
1 голос
/ 11 апреля 2009

Мне кажется, это довольно питонно, если вам нужно только это в одном месте вашего кода.

Следующая ссылка предоставляет более «общий» подход к той же проблеме (например, с декоратором и некоторыми дополнительными функциями), посмотрите на: http://code.activestate.com/recipes/551763/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...