Я пытаюсь создать функцию, которая перезагружает глобальный банк:
import json
type Bank = dict[str, dict[str: int | float]]
def get_ball() -> None:
"""
_summary_
Reloads the bank dict from the bank.json file
"""
global bank
with open("bank.json", "r") as f:
bank: Bank = json.load(f) # Error
# bank = json.load(f) # Works fine
print(bank)
get_ball()
print(bank)
Но возникает синтаксическая ошибка: аннотированное имя «банк» не может быть глобальным.
Если у него нет назначенного типа, он работает нормально (см. закомментированную строку). Что мне нужно сделать?
Или, еще лучше, вообще не используйте глобальные переменные. get_ball
может вернуть dict[str, dict[str: int | float]]
вместо загрузки его в глобальный файл. Таким образом, вы можете написать тест для get_ball
. Обычно лучше избегать глобальных переменных.
Предположительно, bank
(как глобальный) уже имеет тип; вам не нужно аннотировать это «снова».
Заблуждение здесь заключается в том, что код типа bank = json.load(f)
не «определяет» глобальное. Это такое же задание, как и любое другое. Аналогично, global bank
также не «определяет» глобальное. Он просто сообщает Python, что bank
внутри функции должен означать имя в глобальном пространстве имен. Причина ограничения ясна: что, если вы попытаетесь сделать конфликтующую аннотацию в другой функции?
Вы должны объявить это вне функции
type Bank = dict[str, dict[str: int | float]]
#bank:Bank
bank:Bank = {} # or with default value at start
def get_ball() -> None:
"""
_summary_
Reloads the bank dict from the bank.json file
"""
global bank
with open("bank.json") as f:
bank = json.load(f)
print(bank)
get_ball()
print(bank)
Но было бы лучше, если бы вы вообще не использовали global
import json
type Bank = dict[str, dict[str: int | float]]
def get_ball() -> Bank:
"""
_summary_
Reloads the bank dict from the bank.json file
"""
bank:Bank = {} # default value at start
with open("bank.json") as f:
bank = json.load(f)
return bank
data:Bank = get_ball()
print(data)
Действительно, спасибо, я знаю, что мне не следует использовать global, но я работаю с этим значением во всем модуле и не только. Я не особо зацикливаюсь на том, сколько времени это займет.
Почему бы вам не объявить тип в глобальной области перед функцией?