Как сделать много параметров доступными для всей системы? - PullRequest
0 голосов
/ 18 января 2012

У меня есть объекты из разных классов, которые работают вместе для выполнения определенной задачи. Задача требует много параметров, предоставленных пользователем (через файл конфигурации). Параметры используются глубоко внутри системы.

Я могу выбрать, чтобы объект контроллера считывал файл конфигурации, а затем распределял параметры соответствующим образом для следующего слоя объектов и т. Д. На каждом слое. Но только сами объекты знают, какие параметры им нужны, поэтому объект контроллера должен был бы узнать много подробностей о каждом другом объекте.

Другим вариантом является объединение всех параметров в коллекцию и передача всей коллекции в каждый вызов функции (эквивалентно, создание глобального объекта, который хранит их и доступен для всех). Это выглядит и кажется уродливым и может вызвать ряд незначительных технических проблем (например, я не могу позволить двум объектам использовать параметры с одинаковым именем; и т. Д.)

Что делать?

Ответы [ 2 ]

1 голос
/ 18 января 2012

В прошлом я использовал альтернативу "глобальная коллекция".

Если вы беспокоитесь о присвоении имен: как бы вы справились с этим в файле конфигурации?На мой взгляд, ваша глобальная коллекция представляет собой структуру данных, представляющую ту же информацию, что и в вашем файле конфигурации, поэтому, если у вас есть способ разрешения или предотвращения конфликтов имен в вашем cfg-файле, вы можете сделать то же самое в вашей глобальной коллекции.

0 голосов
/ 18 января 2012

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

Я также немного отозвался о декларативном настроении, в которое меня превратил Эликсир.

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

#!/usr/bin/python

import inspect
from itertools import chain, ifilter
from pprint import pprint
from abc import ABCMeta

class Property(object):

    def __init__(self, value=None):
        self._x = value

    def __repr__(self):
        return str(self._x)

    def getx(self):
        return self._x

    def setx(self, value):
        self._x = value

    def delx(self):
        del self._x

    value = property(getx, setx, delx, "I'm the property.")

class BaseClass(object):

    unique_baseclass_thing = Property()

    def get_prop_tree(self):
        mro = self.__class__.__mro__
        r = []
        for i in xrange( 0, len(mro) - 1 ):

            child_prop_names = set(dir(mro[i]))
            parent_prop_names = set(dir(mro[i+1]))

            l_k = list( chain( child_prop_names - parent_prop_names ) )
            l_n = [ (x, getattr(mro[i],x,None)) for x in l_k ]
            l_p = list( ifilter(lambda y: y[1].__class__ == Property, l_n))

            r.append(
                (mro[i],
                    (dict
                        ( l_p )
                    )
                )
            )
        return r

    def get_prop_list(self):
        return list( chain(* [ x[1].items() for x in reversed( self.get_prop_tree() ) ] ) )


class SubClass(BaseClass):
    unique_subclass_thing = Property(1)

class SubSubClass(SubClass):
    unique_subsubclass_thing_one = Property("blah")
    unique_subsubclass_thing_two = Property("foo")

if __name__ == '__main__':

    a = SubSubClass()

    for b in a.get_prop_tree():
        print '---------------'
        print b[0].__name__
        for prop in b[1].keys():
            print "\t", prop, "=", b[1][prop].value
        print

    for prop in a.get_prop_list():

Когда вы запустите его ..


SubSubClass
    unique_subsubclass_thing_one = blah
    unique_subsubclass_thing_two = foo

---------------
SubClass
    unique_subclass_thing = 1

---------------
BaseClass
    unique_baseclass_thing = None

unique_baseclass_thing None
unique_subclass_thing 1
unique_subsubclass_thing_one blah
unique_subsubclass_thing_two foo
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...