Accesing dictionnaire avec attribut class

voix
4

Maintenant, je travaille avec python. Donc, une question sur dict .... supposons que j'ai un dict que

config = {'account_receivable': '4', 'account_payable': '5', 'account_cogs': '8', 'accoun
t_retained_earning': '9', 'account_income': '6', 'account_expense': '31', 'durat
ion': 2, 'financial_year_month': 9, 'financial_year_day': 15, 'account_cash': '3
', 'account_inventory': '2', 'account_accumulated_depriciation': '34', 'account_
depriciation_expense': '35', 'account_salary_expense': '30', 'account_payroll_pa
yable': '68', 'account_discount': '36', 'financial_year_close': '2008-08-08'}

si l'impression -> config [ « account_receivable »] il retournera la valeur correspondante que 4

mais je veux y accéder par là -> config.account_receivable puis il retournera sa valeur correspondante

comment je peux mettre en œuvre cette ??? si quelqu'un peut me aider s'il vous plaît

BR // Nazmul

Créé 27/08/2009 à 04:34
source utilisateur
Dans d'autres langues...                            


6 réponses

voix
12

A cet effet, voici qu'il ya plusieurs années, je l' ai inventé simple Bunchexpression; une façon simple à mettre en œuvre Bunchest le suivant :

class Bunch(object):
  def __init__(self, adict):
    self.__dict__.update(adict)

Si configun dict, vous ne pouvez pas utiliser config.account_receivable- c'est absolument impossible, parce qu'un dict ne possède cet attribut, période. Cependant, vous pouvez envelopper configdans un Bunch:

cb = Bunch(config)

puis accéder cb.config_accountau contenu de votre cœur!

Modifier : si vous voulez l' affectation d' attribut sur l' Bunchaffecter également l'original dict( configdans ce cas), de sorte que par exemple le cb.foo = 23fera config['foo'] = 23, vous avez besoin d' une mise en œuvre slighly différente Bunch:

class RwBunch(object):
  def __init__(self, adict):
    self.__dict__ = adict

Normalement, la plaine Bunchest préférable, exactement parce que , après instanciation, l' Bunchinstance et l' dictétait « apprêté » de sont entièrement découplée - des modifications à l' un d'eux ne portent pas l'autre; et ce découplage, le plus souvent, est ce qui est désiré.

Lorsque vous faites vouloir « couplage » effets, puis RwBunchest la façon de les obtenir: avec elle, chaque paramètre d' attribut ou la suppression de l'instance sera intrinsèquement définir ou supprimer l'élément de la dict, et, vice versa, le réglage ou la suppression d' éléments de la dictvolonté intrinsèquement définir ou supprimer des attributs de l'instance.

Créé 27/08/2009 à 04:42
source utilisateur

voix
7

Vous pouvez le faire avec collections.namedtuple:

from collections import namedtuple
config_object = namedtuple('ConfigClass', config.keys())(*config.values())
print config_object.account_receivable

Vous pouvez en savoir plus sur namedtuple ici:

http://docs.python.org/dev/library/collections.html

Créé 27/08/2009 à 04:42
source utilisateur

voix
3

Jetez un oeil à Convertir Python dict à l' objet? .

Créé 27/08/2009 à 04:37
source utilisateur

voix
2

Vous devez utiliser l' un des Python méthodes spéciales .

class config(object):
    def __init__(self, data):
        self.data = data
    def __getattr__(self, name):
        return self.data[name]


c = config(data_dict)
print c.account_discount
-> 36
Créé 27/08/2009 à 04:40
source utilisateur

voix
0

Vous pouvez sous-classe dict pour retourner les articles de lui-même pour les attributs non définis:

class AttrAccessibleDict(dict):
    def __getattr__(self, key):
        try:
            return self[key]
        except KeyError:    
            return AttributeError(key)

config = AttrAccessibleDict(config)
print(config.account_receivable)

Vous pouvez également remplacer d'autres méthodes aussi bien, par exemple __setattr__, __delattr__, __str__, __repr__et copy.

Créé 27/08/2009 à 09:51
source utilisateur

voix
0

Eh bien, vous pouvez le faire avec un tas d'objets.

class Config(object):
    pass

config = Config()
config.account_receivable = 4
print config.account_receivable

Il est évident que vous pouvez étendre cette classe pour faire plus pour vous. par exemple , définir ainsi __init__vous pouvez créer avec des arguments, et peut - être par défaut.

Vous pourriez aussi utiliser un namedtuple ( lien python 2.4 / 2.5 ). Ceci est une structure de données spécifiquement conçu pour contenir des documents structurés.

from collections import namedtuple
Config = namedtuple('Config', 'account_receivable account_payable')  # etc -- list all the fields
c = Config(account_receivable='4', account_payable='5')
print c.account_receivable

Avec namedtuples, vous ne pouvez pas modifier les valeurs une fois qu'elles ont été définies.

Créé 27/08/2009 à 04:36
source utilisateur

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