#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()