#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 сработал, так как я объявляю его как локальную переменную