Доступ к значениям из пользовательской функции внутри словаря

#python #python-2.7

#python #python-2.7

Вопрос:

У меня есть следующие строки кода для конкретного варианта использования. (С использованием Python 2.7)

 class AutoMap(dict):
    """Implementation of autovivification feature."""
    def __getitem__(self, item):
        try:
            return dict.__getitem__(self, item)
        except KeyError:
            value = self[item] = type(self)()
            return value
    def __dir__(self):
        return dict.keys()
    __getattr__ = dict.get
    __setattr__ = dict.__setitem__
    __delattr__ = dict.__delitem__

obj = AutoMap()
AddressMap = AutoMap()

obj["state"] = "Maharastra"
obj["country"] = "India"

AddressMap['address1'] = obj

obj["state"] = "California"
obj["country"] = "USA"

AddressMap['address2'] = obj

print AddressMap # {'address1': {'state' : 'Maharastra', 'country' : 'India'}, 'address2': {'state' : 'California', 'country' : 'USA'}}

def prn_state():
    print "State: "   state


AddressMap['address1']['_prn_state'] = prn_state

AddressMap['address2']['_prn_state'] = prn_state


print AddressMap # {'address1': {'state' : 'Maharastra', 'country' : 'India', '_prn_state': <function prn_state at 0x7fb297dc7320>}, 'address2': {'state' : 'California', 'country' : 'USA', '_prn_state': <function prn_state at 0x7fb297dc7320>}}

print type(AddressMap) # <class 'AutoMap'>

print AddressMap.address2._prn_state()
  

Теперь я хочу, чтобы всякий раз, когда я пишу эту строку кода, она должна печатать «Калифорния».
Но он выдает ошибку «Ошибка имени: глобальное имя «состояние» не определено»

Комментарии:

1. prn_state это функция, которая ничего не возвращает, как вы назначаете AddressMap[address1]['_prn_state'] = prn_state

2. Просто предоставьте свой код вместо смешивания выходных данных с ним

3. Кроме того, state внутри функции не определено

Ответ №1:

AddressMap является dict , чтобы получить state значение address2 :

 AddressMap = {'address1': {'state' : 'Maharastra', 'country' : 'India'}, 
              'address2': {'state' : 'California', 'country' : 'USA'}}    
print(AddressMap['address2']['state'])
  

Редактировать:

Завернутый в функцию:

 def states(AddressMap, address):
    return AddressMap[address].get('state', 'Not found')

AddressMap = {'address1': {'state' : 'Maharastra', 'country' : 'India'}, 'address2': {'state' : 'California', 'country' : 'USA'}}
print(states(AddressMap, 'address2'))
  

ВЫВОД:

 California
  

Комментарии:

1. Спасибо 🙂 Но на самом деле это не диктант, это класс. Я отредактировал свой вопрос и привел весь код целиком.

Ответ №2:

Как сообщает ошибка, state не определено в глобальном контексте. Это работает:

 class AutoMap(dict):
    """Implementation of autovivification feature."""
    def __getitem__(self, item):
        try:
            return dict.__getitem__(self, item)
        except KeyError:
            value = self[item] = type(self)()
            return value
    def __dir__(self):
        return dict.keys()
    __getattr__ = dict.get
    __setattr__ = dict.__setitem__
    __delattr__ = dict.__delitem__

    def prn_state(self):
        print "State: "   self.state

obj = AutoMap()
AddressMap = AutoMap()

obj["state"] = "Maharastra"
obj["country"] = "India"

AddressMap['address1'] = obj

obj["state"] = "California"
obj["country"] = "USA"

AddressMap['address2'] = obj

print AddressMap

AddressMap['address1']['_prn_state'] = AddressMap['address1'].prn_state

AddressMap['address2']['_prn_state'] = AddressMap['address2'].prn_state


print AddressMap

print type(AddressMap)

AddressMap.address2._prn_state()
  

Комментарии:

1. Спасибо, это помогло. 🙂 Но вывод отображается как «Состояние: Калифорния Отсутствует». Можете ли вы сказать, почему нет? Есть решение?

2. @SarfarazHussain Вы уверены, что вы также изменили последнюю строку с print AddressMap.address2._prn_state() на AddressMap.address2._prn_state() ?

3. Да, теперь это работало без «печати». Спасибо. Но можем ли мы достичь того же, не делая prn_state() функцией-членом класса AutoMap?

Ответ №3:

 class AutoMap(dict):
    """Implementation of perl's autovivification feature."""
    def __getitem__(self, item):
        try:
            return dict.__getitem__(self, item)
        except KeyError:
            value = self[item] = type(self)()
            return value
    def __dir__(self):
        return dict.keys()

    __getattr__ = dict.get
    __setattr__ = dict.__setitem__
    __delattr__ = dict.__delitem__


class Sample:
    def __init__(self, d): 
        self.test = d
    def prn_state(self): 
        print self.test.state

obj = AutoMap()
AddressMap = AutoMap()

obj["state"] = "Maharastra"
obj["country"] = "India"
obj["sample"] = Sample(obj)
AddressMap['address1'] = obj

obj["state"] = "California"
obj["country"] = "USA"
obj["sample"] = Sample(obj)
AddressMap['address2'] = obj

AddressMap.address2.sample.prn_state()