Поддерживает ли PyCharm подсказку типа для глобальных переменных?

Я попытался установить свой глобальный в python_stub следующим образом:

#Inside MyModule.pyi
global MY_GLOBAL #type: list[MyClass]

Однако это не работает, когда я пытаюсь проиндексировать свой глобальный список в основном файле .py:

#Back inside MyModule.py
MY_GLOBAL[0].xyz #<-- Expecting type hinting to pop up after the '.'

Кроме того, я пытался сделать это без файлов python_stub следующим образом:

#Inside MyModule.py
MY_GLOBAL #type: list[MyClass]

#Still in the global scope here
MY_GLOBAL[0].xyz #<-- Type hinting works here!

Когда я делаю это (устанавливая тип локально), он распознает тип в глобальной области, однако, как только я пытаюсь использовать глобальную область в области функции, он забывает тип:

#Inside MyModule.py
MY_GLOBAL #type: list[MyClass]

#Still in the global scope here
MY_GLOBAL[0].xyz #<-- Type hinting works here!

def MyFunction():
    global MY_GLOBAL
    MY_GLOBAL[0].xyz #<-- Expecting type hinting to pop up after the '.'

Кто-нибудь знает, поддерживается ли это поведение? Я использую PyCharm 5.0 Community Edition.


person Novark    schedule 13.04.2016    source источник
comment
Заголовок не связан с реальной проблемой, как ответили здесь   -  person Yariv    schedule 24.12.2019


Ответы (1)


Это не проблема с подсказкой типа. Проблема в том, что у вас вообще нет переменной MY_GLOBAL.

global MY_GLOBAL - это не то, как вы создаете глобальную переменную. В Python нет такой вещи*, как действительно глобальная переменная. Вы создаете глобальную переменную уровня модуля так же, как и локальную переменную:

MY_GLOBAL = []

но на уровне модуля, а не внутри функции. Если вы хотите получить к нему доступ из другого модуля, вам необходимо импортировать модуль и использовать точечную нотацию доступа:

import whichever_module_defined_the_global as m

m.MY_GLOBAL.append(3)

Попытка импортировать его с помощью импорта from вызовет странные проблемы, поэтому не делайте этого.

*Кроме таких вещей, как max или open.

person user2357112 supports Monica    schedule 13.04.2016
comment
Спасибо за ответ, я думаю, что, возможно, я опечатался в этой первой строке. Это должно было быть просто MY_GLOBAL = [], как вы описали. Однако мне действительно удалось решить мою проблему. Мне пришлось удалить ссылку на глобальную в области локальной функции, где я хотел подсказку типа. - person Novark; 14.04.2016
comment
на самом деле, max и open и т. д. также не являются глобальными, дело в том, что модуль __builtins__ импортируется (и добавляет свое содержимое в глобальную область, например globals()['thing'] = thing) каждый раз, когда запускается интерпретатор, если только он не передал переключатель -S. - person ocket8888; 24.09.2018
comment
@ocket8888: Нет, это не так. Это модуль builtins или __builtin__, и он не выгружает свое содержимое в globals(); он используется как запасной вариант, когда имя не найдено в глобальных переменных модуля. Под капотом у объектов фрейма есть член f_builtins, хранящий их глобальную переменную dict, которая устанавливается с помощью глобальной переменной f_builtins или __builtins__ другого фрейма, а __builtins__ обычно устанавливается либо в модуль builtins/__builtin__, либо в dict этого модуля. - person user2357112 supports Monica; 24.09.2018
comment
Кроме того, -S не влияет на резервную копию встроенной переменной; он отключает автоматический импорт модуля site. - person user2357112 supports Monica; 24.09.2018