Управление большим количеством аргументов ключевых слов в Pythonic манере - PullRequest
0 голосов
/ 15 июля 2011

У меня есть класс, для которого _ init _ функция требует довольно много ключевых аргументов.Я хотел бы иметь возможность в основном переписать этот бит кода, чтобы он был синтаксически чище (менее жесткое кодирование).Желательно, чтобы я мог получить его так, чтобы простое добавление аргумента ключевого слова в _ init _ изменило бы все атрибуты / аргументы в нулевой функции соответственно.

class Class :

    def __init__ (self, kw0=0, kw1=1, kw2=2) :

        ''' The keyword arguments as strings. '''
        self.Keys = ['kw0', 'kw1', 'kw2']

        ''' Their values. '''
        self.Values = [kw0, kw1, kw2]

        ''' A dictionary made from the keys and values. '''
        self.Dict = self.make_dict()

        ''' As individual attributes, '''
        self.KW0, self.KW1, self.KW2 = self.Values

    def make_dict (self) :
        ''' Makes a dictionary '''

        keys   = self.Keys
        values = self.Values

        _dict = {}
        for i in xrange(len(keys)) :
            key   = keys[i]
            value = values[i]

            _dict[key] = value

        return _dict

    def null (self, kw0=None, kw1=None, kw2=None) :
        ''' The same keyword arguments as **__init__** but they all default
            to **None**. '''

        pass

c = Class()
print c.Keys
print c.Values
print c.Dict
print c.KW0
print c.KW1
print c.KW2

Ответы [ 2 ]

3 голосов
/ 15 июля 2011

Это одна вещь, которую я люблю в питоне.В вашем __init__

def __init__ (self, **kwargs):
    self.__dict__.update(kwargs)

будут добавлены те члены, которые определены в словаре kwargs, как члены класса.

EDITED - для отражения правильного синтаксиса для ** kwargs и обновления() вместо append ()

2 голосов
/ 15 июля 2011

Почему бы не принять любые ключевые аргументы.Вы можете использовать атрибут класса для допустимых имен ключевых слов и их значений по умолчанию.

class Class(object):

     _defaults = dict(kw0=42, kw1=None, kw2=True, kw3="Ni!")

     def __init__(self, **kwargs):

        # Raise exception if any non-supported keywords supplied
        if set(kwargs.keys()) - set(self._defaults.keys()):
            raise KeyError("unsupported keyword argument")

        # Update our instance with defaults, then keyword args
        self.__dict__.update(self._defaults)
        self.__dict__.update(kwargs)

Если вы хотите использовать одну и ту же функциональность в нескольких методах (например, __init__() и null()), просто разбейте аргументобрабатывать код в своем собственном методе и вызывать его из обоих мест.

Недостатком является то, что help() и другие инструменты документации Python не будут отображать допустимые аргументы ключевых слов, поскольку они отсутствуют в сигнатуре вашего метода..

Кстати, я не совсем уверен, почему вы храните ключи и значения отдельно.Просто сохраните их как словарь, а затем получите ключи или значения, когда вы хотите их, используя метод .keys() или .values() словаря.

...