Невозможно определить глобальную переменную, имеющую тип внутри функции

Я пытаюсь создать функцию, которая перезагружает глобальный банк:

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)

Но возникает синтаксическая ошибка: аннотированное имя «банк» не может быть глобальным.

Если у него нет назначенного типа, он работает нормально (см. закомментированную строку). Что мне нужно сделать?

Почему бы вам не объявить тип в глобальной области перед функцией?

jonrsharpe 28.04.2024 17:17

Или, еще лучше, вообще не используйте глобальные переменные. get_ball может вернуть dict[str, dict[str: int | float]] вместо загрузки его в глобальный файл. Таким образом, вы можете написать тест для get_ball. Обычно лучше избегать глобальных переменных.

erik258 28.04.2024 17:28

Предположительно, bank (как глобальный) уже имеет тип; вам не нужно аннотировать это «снова».

chepner 28.04.2024 17:39

Заблуждение здесь заключается в том, что код типа bank = json.load(f) не «определяет» глобальное. Это такое же задание, как и любое другое. Аналогично, global bank также не «определяет» глобальное. Он просто сообщает Python, что bank внутри функции должен означать имя в глобальном пространстве имен. Причина ограничения ясна: что, если вы попытаетесь сделать конфликтующую аннотацию в другой функции?

Karl Knechtel 03.05.2024 21:40
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы должны объявить это вне функции

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, но я работаю с этим значением во всем модуле и не только. Я не особо зацикливаюсь на том, сколько времени это займет.

Patrovsky games 02.05.2024 10:38

Другие вопросы по теме