Переменная класса кэшируется?

#python #class #global #falconframework

#питон #класс #глобальный #фальконструкция

Вопрос:

У меня странная проблема, которую мне трудно понять, возможно, исходя из того, как глобальные переменные или переменные класса работают в python. У меня есть класс falcon, в котором я вызываю rest api с дизайном класса. Я изменяю team_map на основе другого вызова API, который я делаю. (Я очистил код, чтобы его было легче понять). Тем не менее, похоже, что он всегда использует обновленные значения, независимо от того, что user_permission есть. Если я выключу свой сервер gunicorn и начну снова, то в первый раз он будет работать нормально, но вторые запросы всегда будут одинаковыми или кэшированными.

 class Reach(BaseClass):   team_map = {  "Lakers": 'Los Angeles',  "Celtics": 'Boston',  "GSW": 'San Francisco',  "Clippers": 'Los Angeles',  }   def __init__(self, name):  super().__init__(name)  self.disabled = False   def get_query_template(self, req_data):   user_permission= self.get_user_permission(req_data) //sample API request, this returns true or false depending on different scenarios    # new xandr reach freq mviews  if user_permission:  self.team_map["Lakers"] = 'New Los Angeles'  self.team_map["Celtics"] = 'New Boston'  self.team_map["GSW"] = 'New San Francisco'    print("team map",team_map)  return team_map  

Первый звонок: user_permission есть True .

Он возвращается:

 "Lakers": 'New Los Angeles', "Celtics": 'New Boston', "GSW": 'San Francisco', "Clippers": 'Los Angeles',  

Второй звонок: user_permissions есть False , и он все еще возвращается

 "Lakers": 'New Los Angeles', "Celtics": 'New Boston', "GSW": 'San Francisco', "Clippers": 'Los Angeles',  

в то время как я ожидаю, что он вернет первое состояние. Я не знаю, почему это происходит, я попытался использовать global ключевое слово и вывести меня team_map за пределы класса, но это не сработало.

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

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

2. team_map определяется как глобальная переменная. Измените содержимое словаря в одном месте, и вы увидите это изменение повсюду. Если вы определитесь team_map в get_query_template этом, этого не произойдет.

3. team_map это не глобальная переменная, это атрибут класса . Если вы хотите, чтобы данные не были разделены между всеми экземплярами класса, вы должны сделать их атрибутом экземпляра . Вы можете сделать это, установив его не в теле класса, а self.test_map в __init__ методе класса.

4. Я не понимаю, как код, которым вы поделились, выдает результат, который вы показываете. Если user_permissions это True первый раз, когда вы это называете, и все же team_map "GSW": 'San Francisco', это не 'New San Francisco' так . Я не понимаю, как это возможно, если только другой экземпляр класса не перезаписывает этот элемент перед печатью результатов. И да, как уже было сказано, переменная класса, подобная этой, является общей для всех экземпляров. Только self. переменная специфична для экземпляра. Для меня не совсем ясно, чего вы ожидаете, по сравнению с тем, что происходит.

5. Ответ @Matthias сработал, так как я объявляю его как локальную переменную